2017-07-06 77 views
0

我正在製作一個電影欄項目,我必須重定向url以獲得RESTful,但我不知道如何完成它。下面的信息可能是有用的:[Ruby on Rails]重定向到REST風格的URL

我無法做到:GET /movies when selecting a movie rating should redirect to a RESTful route

耙路線:
Prefix Verb URI Pattern Controller#Action root GET / movies#index movies GET /movies(.:format) movies#index POST /movies(.:format) movies#create new_movie GET /movies/new(.:format) movies#new edit_movie GET /movies/:id/edit(.:format) movies#edit movie GET /movies/:id(.:format) movies#show PATCH /movies/:id(.:format) movies#update PUT /movies/:id(.:format) movies#update DELETE /movies/:id(.:format) movies#destroy

The UI of the webpage

的一些說明什麼,我必須做的:(通常說,如果用戶有意從url中刪除一些屬性,我已將其重定向到正確的url):

要成爲RESTful,我們希望保留導致排序/過濾視圖的URI始終包含相應的排序/過濾參數的屬性。

我已經實現了做任務的代碼:

if !(params.has_key?(:sort_by)) #check the url has this parameter 
    if session[:sort_by]   #has cookie 
    redirect_to movies_path(:sort_by => session[:sort_by]) #redirect using cookie, not sure need to add :ratings 
    else 
    session[:sort_by] = "id" # default sorting 
    end 
end 

if !(params.has_key?(:ratings)) 
    if session[:ratings] 
    redirect_to movies_path(:ratings => session[:ratings]) # error: AbstractController::DoubleRenderError 
    else 
    session[:rating] = {"G"=>"1", "PG"=>"1", "PG-13"=>"1", "R"=>"1"} 
    end 
end 

:sort_by是控制屬性的電影是如何排序,例如session[:sort_by] = "date"表示在發佈日期排序。

:收視率是一樣的東西:"ratings"=>{"G"=>"1", "PG-13"=>"1", "R"=>"1"}

URL的一個例子:/movies?ratings%5BG%5D=1&ratings%5BPG%5D=1&ratings%5BPG-13%5D=1&ratings%5BR%5D=1&sort_by=title

如果我鍵入類似... /電影,應該從餅乾(如果有的話)生成的URL。但我有一些問題:
例如,我們檢查sort_by丟失,並有會議sort_by,我們仍然需要提供會議[:評級] movies_path()?如果這是我第一次來到這個網站(沒有會話[:評價] /會議[:sort_by]),但我仍然需要RESTful URL(默認情況下,所有選中的框被「點擊」),該怎麼辦?

更多說明:
因此,您應該在URL中缺少參數時重定向,而不是在URL +會話中。 這意味着當'sort_by'不在URL中,但在會話中時,您應該使用會話數據填寫此URL並重定向到完整的URL(因此如果'rating'也缺失,請填寫。 現在如果URL和會話中缺少參數,該怎麼辦?你應該依賴一些初始化規則。對於「收視率」,您應該檢查所有收視率;對於'sort_by',可以將關鍵字設置爲'id',這是項目默認排序的方式(由Movie.all返回的數組中的電影順序)。

回答

0

像這樣的東西應該工作會議上設立的參數值,如果一個傳遞在

def index 
    session[:sort_by] = if params[:sort_by].present? 
         params[:sort_by] 
         else 
         session[:sort_by] || 'id' 
         end 
    session[:rating] = if params[:rating].present? 
         params[:rating] 
        else 
         session[:rating] || { 'G' => '1', 'PG' => '1', 'PG-13' => '1', 'R' => '1' } 
        end 

    if !(params[:sort_by].present? && params[:rating].present?) 
    redirect_to movies_path(sort_by: session[:sort_by], rating: session[:rating]) 

    return 
    end 
end 

一兩行,否則檢查現有會話的值,然後回落到默認值。

然後,我們查看是否缺少sort_by或rating參數,我們將重定向,以便在會話中將新的值包括在內。

我相信這符合您的所有標準。你遇到的主要問題是,只要你調用redirect_to,它就會嘗試重定向,它不喜歡在它後面有代碼(特別是其他重定向或呈現調用)。所以你需要檢查你需要的任何條件,然後把它全部整合到一個重定向調用中,然後從方法返回,所以它不會嘗試渲染。