出于RESTful目的,我的路由就像这样:
的routes.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 %>
另一种观点
答案 0 :(得分:2)
虽然宁静的路由是最直观和最传统的,但它并不总是符合我们的需求。
在您的情况下,我建议使用查询参数而不是严格的休息路径。
example.com/shops
将收到3个查询参数:sort
,genre
和area
,因此网址可能会显示为example.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
哈希值是否仅包含您愿意接受的值。