[Ruby on Rails]重定向到RESTful URL

时间:2017-07-06 20:13:05

标签: ruby-on-rails ruby rest session

我正在开发一个电影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

The UI of the webpage

我必须做的一些描述:(通常说如果用户故意从网址中删除某些属性,我会将其重定向到正确的网址):

要成为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返回的数组中的电影顺序)。

1 个答案:

答案 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,它就会尝试重定向,它不喜欢在它之后有代码(尤其是其他重定向或渲染调用)。因此,您需要检查所需的任何条件,然后将其全部集中到一个重定向调用中,然后从方法返回,这样它就不会尝试渲染。