DocumentsController#common_query可以处理多种不同的请求样式。
即。批处理4中的所有文档或标记为“happy”的所有文档
我想要一条让他们漂亮的路线,所以:
/文档/ common_query?批次= 4
/文档/ common_query?标签=快乐
成为:
/文档/批次/ 4
/文档/标签/快乐
所以最终结果是#common_query被调用,但是url的一部分被用作param名称,而part被用作它的值。
答案 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
具有相同的效果,但更具体,因此您不必担心路线的优先顺序。