Rails 3 路由如何匹配多个?
Posted
技术标签:
【中文标题】Rails 3 路由如何匹配多个?【英文标题】:Rails 3 routing how to match multiple? 【发布时间】:2011-08-12 19:18:25 【问题描述】:如何匹配多个控制器,例如一个 id?
我已经在我的路线中尝试过这个:
match '/:id' => 'kategoris#show'
match '/:id' => 'tags#show'
【问题讨论】:
你不能那样做 :) 只是想知道,你为什么要做这样的事情? 因为我有分类和标签。我想要一个扁平的链接结构 如果有 ID = 1 的类别和标签,那么您的路线将如何处理此请求:/1
?
我使用 has_friendly_id :name, :use_slug => true
而且没有重复的名字
【参考方案1】:
match 'kategoris/:id' => 'kategoris#show'
match 'tags/:id' => 'tags#show'
或
match '/:id/kategoris' => 'kategoris#show'
match '/:id/tags' => 'tags#show'
【讨论】:
我想要一个扁平的链接结构【参考方案2】:如果您想匹配 http://example.com/<something>
,Rails 控制器路由不适合您。
你可以创建一个 ThingsController:
match '/:id' => 'things#show'
然后在你的 ThingsController 中做一些适当的事情。
例如。在 Sinatra(您可以将其安装为 Rack 中间件)中,您可以这样做:
get "/:id" do :id
if(@tag = Tag.find(:id))
haml :tag
elsif(@category = Category.find(:id))
haml :category
else
pass #crucially passes on saying 'not found anything'.
end
end
无论哪种方式,你都会从 RESTful Rails 的支持者那里得到痛苦的尖叫。
【讨论】:
谢谢!我会选择单一的控制器动作策略。我不知道我可以从路由中获得如此美妙的东西:)【参考方案3】:如果您可以在标签 ID 和类别 ID 中实现可识别的差异,那么您可以使用约束来查找它们。例如,如果类别总是以数字开头而标签从不这样做,那么您可以这样做。
match '/:id' => 'categories#show', :constraints => :id => /^\d+/
match '/:id' => 'tags#show'
仅当:id
以数字开头时,第一行才会匹配。如果不匹配,则第二行捕获剩菜。所以; /67-something
被路由到类别控制器,/something
被路由到标签控制器。
【讨论】:
以上是关于Rails 3 路由如何匹配多个?的主要内容,如果未能解决你的问题,请参考以下文章
Rails ActionController::RoutingError (没有路由匹配 [POST] "/"):