0

出于 RESTful 的目的,我的路由是这样的:

路线.rb

match 'shops/:sort/:genre/:area', :to => 'shops#index'  

但是如果流派是空的呢?不会重定向到example.com/shops/newest_first//california?

我该如何解决这种路由和参数问题?谁能给我一个很好的例子?

看法

<%= form_tag shops_path, :method => :get do %>
    <%= select_tag :sort, options_from_collection_for_select(Sort.all, 'id', 'name', params[:sort]), :prompt => "Newest first" %>
    <%= select_tag :genre, options_from_collection_for_select(Genre.all, 'id', 'name', params[:genre]), :prompt => "all" %>
    <%= select_tag :area, options_from_collection_for_select(Area.all, 'id', 'name', params[:area]), :prompt => "all" %>
<% end %>

另一种观点

4

1 回答 1

2

虽然 restful 路由是最直观和最传统的,但它并不总是符合我们的需求。

在您的情况下,我建议使用查询参数而不是严格的宁静路线。

example.com/shops将收到 3 个查询参数:和sort,因此 URL 可能看起来像genreareaexample.com/shops?area=california&sort=newest_first

在您的控制器的索引操作中,您可以通过以下方式查询这些参数是否存在:

def index
  if !params[:sort].blank?
    @shops = @shops.sort(params[:sort])
  end
  if !params[:area].blank?
    @shops = @shops.where(:area => params[:area])
  end
  .
  .
  .
end

通过这种方式,您可以很好地防止控制器中缺少参数,但您仍然可以提供用户请求的任何数据。

附带说明:请务必检查params您使用的哈希是否仅包含您愿意接受的值。

于 2013-01-09T14:28:55.750 回答