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] "/"):

Rails 资源路由缺少参数但匹配文档

如何从控制器路由 Rails 4 获得不同的和多个视图

Rails 4 RoutingError:没有路由匹配 [POST]

Rails 路由约束和 UTF-8

Rails第二次更新时没有路由匹配[POST]