从Rails 3中的URL中删除controller_name并使用自定义字符串而不是id

时间:2012-03-23 18:49:10

标签: ruby-on-rails ruby-on-rails-3 url

从一开始我就总是把这个问题放在rails,没有控制器名称的短网址上。

例如,我有一个博客,我不想在网址中有任何日期或控制器名称,我已经在我的数据库中有一个带有唯一字段url的Page模型。 Rails适用于这样的网址:

jeena.net/pages/1

当我修改模型时,我甚至可以使用

jeena.net/pages/foo

但似乎并不重要我做了什么我不能让它与它一起工作:

jeena.net/foo

当然我希望索引页仍可以使用

jeena.net/pages

我想要创建新页面并更新旧页面,以及link_to() - 方法。所有建议都表示赞赏。

1 个答案:

答案 0 :(得分:2)

要定义该路线,请尝试将以下内容添加到routes.rb:

match '/:id' => 'your_controller#your_action'

这几乎与所有内容匹配您的模型的ID。这不是很好......你不想将youe_host / pages路由到页面控制器,id等于'pages'...为了防止这种情况发生,请确保将该行放在末尾routes.rb文件。路由器使用与收到的路径匹配的第一条路由,因此将该行放在它的末尾将确保它只有在用完其他有意义的选项后才匹配您的路由。

更好的做法是将regexp约束传递给路由器,以便它只匹配具有特定格式的ID:

match '/:id' => 'your_controller#your_action', :constraints => { :id => /your_regexp/ }

如果您对导轨系统有疑问,请参阅指南。它编写得非常好,涵盖了许多重要的事情。

Rails rounting - Official Guides

编辑:创建一个命名路由,您可以在控制器中调用并覆盖可能使用resource创建的正常路由,您必须提供{{ routes.rb

中的1}}参数
:as =>

然后你就可以在你的控制器/视图中调用它:

match '/:id' => 'your_controller#your_action', :as => some_name

希望这会有所帮助。花点时间阅读指南,它有很多有用的信息,包括有关创建命名路线的更多细节。