更改Rails路由资源中:id参数的名称

我环顾四周如何更改dynamic参数插槽,发现这个post,确切的事情。 这个post是http://robots.thoughtbot.com/post/159809070/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 

这些路线创build以下path:

 /clients/:client_name /clients/:client_name/sites/:name /clients/:client_name/sites/:site_name/articles/:title 

一种解决scheme是重写模型中的def to_param方法,但我不想触摸模型本身。

但是,既然它的Rails 2.x,我怎么能实现相同的Rails 3?

更新

这个应用程序正在使用Mongoid。 不是AR。 所以,gem友好不能使用afaik。

Rails 4&5

在Rails 4中,添加了:param选项,这看起来完全符合你的要求。 与Rails 4代码相比,您可以看看Rails 3的 代码 。

细节

你可以很容易地在你的routes.rb文件中实现这个:

 # config/routes.rb resources :posts, param: :slug # app/controllers/posts_controller.rb # ... @post = Post.find_by(slug: params[:slug]) # ... 

从Rails 4的发布开始,这个function在Rails Guides中有logging 。

Rails 3

不幸的是,在Rails 3中, resources:key选项被删除了,所以你不能再通过传入一个额外的选项来简单地改变以这种方式创build的路由的名字。

细节

我假设你已经在过去一年中以某种方式获得了应用程序的工作方式,但是我将采用一种方法来获得你在Rails 3中描述的效果,在routes.rb 。 这只会涉及比to_param方法更多的工作。 你仍然可以在使用scopematch定义的路由中定义自定义参数(或者它的expression式, putpostdelete )。 您只需在匹配器中input所需的参数名称即可:

 get 'clients/:client_name', :to => 'clients#show', :as => client scope 'clients/:client_name' do get 'sites/:name', :to => 'sites#show', :as => site end 

你将不得不手动添加resources自动为你创build的所有路由,但它会实现你正在寻找的。 您也可以有效地将scope :controller选项和其他scope块用于取出一些重复。


编辑(2014年5月8日):更明显的答案包含Rails 3和4的信息。更新链接到代码去确切的行号和提交,以便他们应该工作一段较长的时间。

编辑(2014年11月16日): Rails 4应该在现在的顶部,包括相关的信息,因为它已经是现在的Rails的相当长一段时间了。

编辑(2016年8月9日):反映该解决scheme仍然在Rails 5中工作,并更新过时的链接。

在Rails 4中,传递param选项来改变:id参数。 例如resources :photos, param: :photo_name会生成/ photos /:photo_name

如果我正确理解你,你想要的是在你的url中有client_name而不是id ,对吧?

你可以通过覆盖模型中的to_param方法来做到这一点。 你可以在这里获得更多的信息。

有一个gem,就像所有东西都有gem一样;)

我一直在使用FriendlyId在rails 3中的这种行为。

这将需要你添加一些代码到你的模型,但是,像这样:

 class Client < ActiveRecord::Base has_friendly_id :name end 

…如果你的客户没有URI兼容的名字,你可能想要使用一个slug,你可以用has_friendly_id :name, :use_slug => true 。 当使用slu you时,显然还需要将它们保存到数据库中。

正如已经提到的那样,您仍然可以使用rails 3的to_param技巧,如此处所述 。 虽然我发现FriendlyId更多function。