更改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
方法更多的工作。 你仍然可以在使用scope
和match
定义的路由中定义自定义参数(或者它的expression式, put
, post
和delete
)。 您只需在匹配器中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。