Param名称和值(独立)作为Rails Route的一部分

时间:2008-12-04 06:19:38

标签: ruby-on-rails routes

DocumentsController#common_query可以处理多种不同的请求样式。

即。批处理4中的所有文档或标记为“happy”的所有文档

我想要一条让他们漂亮的路线,所以:

/文档/ common_query?批次= 4

/文档/ common_query?标签=快乐

成为:

/文档/批次/ 4

/文档/标签/快乐

所以最终结果是#common_query被调用,但是url的一部分被用作param名称,而part被用作它的值。

2 个答案:

答案 0 :(得分:1)

第二个选项,有两个路由,几乎可以肯定是更好的方法,因为它只匹配你想支持的URL类型,而第一个选项也会匹配像/ documents / foo这样的URL / bar,这可能会导致您的#common_query方法最多返回RecordNotFound(404)响应。在最坏的情况下,如果您还没有准备好看不到任何预期的参数,那么您将收到500错误...

当然,如果你开始有很多变化,你最终会得到很多路线。如果你需要组合使用它们,例如/ documents / batch / 4 / tag / happy,那么你需要使用通配符路由,并在你的控制器中进行参数处理。这可能类似于:

map.connect 'documents/*specs', :controller => "documents_controller", :action => "common_query"

URL的各种元素将作为params [:specs]提供给您的控制器。你可能会把它变成这样的发现:

@items = Item.find(:all, :conditions => Hash[params[:specs]])

Hash []技术将一维选项数组转换为键值哈希,即使你不直接将它提供给find()也可能很有用。

答案 1 :(得分:0)

作为单一路线:

ActionController::Routing::Routes.draw do |map|
  map.connect "documents/:type/:id", :controller => "documents_controller", 
              :action => "common_query"
end

然后params[:type]将为"batch""tag"params[:id]"4""happy"。您必须确保路由中DocumentsController的其他操作在此之前,因为这将匹配任何看起来像"documents/*/*"的网址。

但为什么它必须是一条路线?您可以使用以下两条路线:

map.with_options(:controller => "documents_controller", 
                 :action => "common_query") do |c|
  c.connect "documents/batch/:page", :type => "batch"
  c.connect "documents/tag/:tag",    :type => "tag"
end

具有相同的效果,但更具体,因此您不必担心路线的优先顺序。