ruby-on-rails - 更改 :id parameter in Routing resources for Rails 的名称

标签 ruby-on-rails ruby ruby-on-rails-3

我四处查看如何更改动态参数槽,发现这篇文章完全符合要求。 帖子是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 codeRails 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 方法涉及更多的工作。您仍然可以在使用 scopematch(或者它的同类 getputpostdelete)。您只需在匹配器中写入您想要的参数名称:

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/

相关文章:

ruby-on-rails - 使用 HMABTM 验证所有权的最佳方式

ruby-on-rails - 一次多个 Nokogiri 请求

ruby-on-rails - Rails 5 测试 NoMethodError

ruby - 优化嵌套的activerecord查询

ruby-on-rails - 如何在不实际保存更改的情况下完成 update_attributes

cucumber - 为什么 RCov 排除 View 并包括评论?

ruby-on-rails - Ruby on Rails 的 Windows 和云的替代方案

ruby-on-rails - rails/minitest 不为选择的测试加载 fixture

ruby-on-rails - 路由错误 - 没有路由匹配 "/"?

ruby - 在内存中预加载 minitest 以提高速度