Ruby on rails 从Rails 3中的URL中删除控制器名称,并使用自定义字符串而不是id

Ruby on rails 从Rails 3中的URL中删除控制器名称,并使用自定义字符串而不是id,ruby-on-rails,ruby-on-rails-3,url,Ruby On Rails,Ruby On Rails 3,Url,从一开始,我就一直认为rails存在这个问题,即没有控制器名称的短URL 例如,我有一个博客,我不希望url中有任何日期或控制器名称,我已经有一个页面模型,在我的数据库中有一个唯一的字段url。Rails非常适合这样的URL: jeena.net/pages/1 当我修改模型时,我甚至可以使用它 jeena.net/pages/foo 但我做什么似乎无关紧要,我无法让它工作,只是: jeena.net/foo 当然,我希望索引页仍然可以使用 jeena.net/pages 我希望创建新页面和更新

从一开始,我就一直认为rails存在这个问题,即没有控制器名称的短URL

例如,我有一个博客,我不希望url中有任何日期或控制器名称,我已经有一个页面模型,在我的数据库中有一个唯一的字段
url
。Rails非常适合这样的URL:

jeena.net/pages/1

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

jeena.net/pages/foo

但我做什么似乎无关紧要,我无法让它工作,只是:

jeena.net/foo

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

jeena.net/pages


我希望创建新页面和更新旧页面,以便在某些was中也能正常工作,以及使用link_to()-方法。感谢所有建议。

要定义该路线,请尝试将以下内容添加到您的路线中。rb:

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

更好的做法是将regexp约束传递给路由器,这样它将只匹配具有特定格式的ID,如下所示:

match '/:id' => 'your_controller#your_action', :constraints => { :id => /your_regexp/ }
如果您对轨道轮转系统有疑问,请参阅指南。它写得很好,涵盖了很多重要的东西

编辑:要创建命名路由,您可以在控制器中调用该路由并覆盖您可能正在使用
资源创建的正常路由,您必须在routes.rb中提供
:as=>
参数

match '/:id' => 'your_controller#your_action', :as => some_name
然后,您可以在控制器/视图中调用它,如下所示:

link_to some_name_path(@my_string_id)

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

是的,这已经在起作用了,我的问题是,当我使用
链接到@page.title,@page
助手时,它仍然会生成一个带有/pages/foo的链接,而不仅仅是/foo.ah,这不是问题所在。这很容易解决,您只需命名该路线。然后rails为您创建了一个助手,您可以像这样调用它:link\u到您的名为路径的路径。我将编辑答案:)