我四处查看如何更改动态参数槽,发现这篇文章完全符合要求。 帖子是https://thoughtbot.com/blog/rails-patch-change-the-name-of-the-id-parameter-in
基本上它所做的是,如果以下是路线:
map.resources :clients, :key => :client_name do |client|
client.resources :sites, :key => :name do |site|
site.resources :articles, :key => :title
end
end
这些路由创建以下路径:
/clients/:client_name
/clients/:client_name/sites/:name
/clients/:client_name/sites/:site_name/articles/:title
一种解决方案是覆盖模型中的 def to_param
方法,但我希望在不触及模型本身的情况下这样做。
但由于它适用于 Rails 2.x,我如何才能在 Rails 3 上实现相同的效果?
更新
此应用程序正在使用 Mongoid。不是增强现实。 所以,gem friendly 不能使用 afaik。
最佳答案
rails 4 和 5
在 Rails 4 中,添加了 :param
选项,它似乎完全符合您的要求。你可以看看Rails 3 code与 Rails 4 code 相比.
详情
您可以在您的 routes.rb
文件中轻松实现:
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
在 Rails 4 发布时,此功能是 documented in the Rails Guides .
rails 3
不幸的是,在 Rails 3 中,resources
的 :key
选项被删除了,因此您不能再通过传递来轻松更改以这种方式创建的路由的名称在一个额外的选项中。
详情
我假设您在过去的一年里已经以某种方式让应用程序按照您想要的方式工作,但我将探讨如何在 routes.rb
中获得您在 Rails 3 中描述的效果.它只会比 to_param
方法涉及更多的工作。您仍然可以在使用 scope
和 match
(或者它的同类 get
、put
、post
和 delete
)。您只需在匹配器中写入您想要的参数名称:
get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
您必须手动添加 resources
自动为您创建的所有路由,但它会实现您正在寻找的。您还可以有效地将 :controller
选项与 scope
和附加的 scope
block 一起使用,以消除一些重复。
编辑(2014 年 5 月 8 日): 使答案更明显地包含 Rails 3 和 4 的信息。更新指向代码的链接以转到确切的行号和提交,以便它们应该可以工作更长的时间。
编辑(2014 年 11 月 16 日):Rails 4 现在应该位于顶部并包含相关信息,因为它已经成为 Rails 的当前版本已有一段时间了。
编辑(2016 年 8 月 9 日):反射(reflect)该解决方案在 Rails 5 中仍然有效,并更新过时的链接。
关于ruby-on-rails - 更改 :id parameter in Routing resources for Rails 的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592038/