我正在开发一个电影rails项目,我必须将网址重定向为RESTful,但我不知道如何完成它。以下信息可能有用:
我没有:GET /movies when selecting a movie rating should redirect to a RESTful route
rake路线:
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
我必须做的一些描述:(通常说如果用户故意从网址中删除某些属性,我会将其重定向到正确的网址):
要成为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"}
网址示例:/movies?ratings%5BG%5D=1&ratings%5BPG%5D=1&ratings%5BPG-13%5D=1&ratings%5BR%5D=1&sort_by=title
如果我键入类似... / movies的内容,则应该从cookie(如果有的话)生成url。但我遇到了一些问题:
例如我们检查sort_by是否缺失,并且有sort_by的会话,我们是否还需要为movies_path()提供会话[:ratings]?如果这是我第一次来到这个网站怎么办(没有会话[:评级] /会话[:sort_by]),但我仍然需要RESTful URL(默认情况下,所有选中的框都被'点击')
更多说明:
因此,您应该在URL中缺少参数时重定向,而不是在URL +会话中重定向。
这意味着当'sort_by'不在URL中但在会话中时,您应该使用会话数据完成此URL,并重定向到完整的URL(如果“rating”也缺失,请填写)。
现在如果URL和会话中都缺少参数怎么办?您应该依赖一些初始化规则。对于“评级”,您应该检查所有评级;对于'sort_by',您可以将关键字设置为'id',这是默认情况下项目的排序方式(Movie.all返回的数组中的电影顺序)。
答案 0 :(得分: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,它就会尝试重定向,它不喜欢在它之后有代码(尤其是其他重定向或渲染调用)。因此,您需要检查所需的任何条件,然后将其全部集中到一个重定向调用中,然后从方法返回,这样它就不会尝试渲染。