我正在製作一個電影欄項目,我必須重定向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
的一些說明什麼,我必須做的:(通常說,如果用戶有意從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返回的數組中的電影順序)。