Ruby on rails 如何重命名默认标识符参数";id";在导轨中';map.resources()?

Ruby on rails 如何重命名默认标识符参数";id";在导轨中';map.resources()?,ruby-on-rails,resources,routes,params,Ruby On Rails,Resources,Routes,Params,我喜欢Rail的map.resources生成的所有默认路线。但是,在某些情况下,我希望在路由中使用非数字标识符。例如,如果嵌套路由由用户及其文章组成,则标准路由可以这样编写: map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id' 但是,不使用Rails生成的默认数字标识符有许多优点/原因。有没有一种方法可以将default:id参数替换为我选择的另一个规范标识符,而不会

我喜欢Rail的map.resources生成的所有默认路线。但是,在某些情况下,我希望在路由中使用非数字标识符。例如,如果嵌套路由由用户及其文章组成,则标准路由可以这样编写:

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'
但是,不使用Rails生成的默认数字标识符有许多优点/原因。有没有一种方法可以将default:id参数替换为我选择的另一个规范标识符,而不会导致为每个标准操作编写自定义路由?假设我想要以下格式的路线:

'/users/:login/articles/:id'

使用map.resources可以实现这种路由吗?

您可以通过覆盖模型中的参数来更改在URL中使用ID的默认设置。e、 g

class User < ActiveRecord::Base
  def to_param
    login
  end
end

user_articles_path(@user) => "/users/:login/articles"
class用户“/users/:login/articles”

您需要做的另一个更改是通过登录而不是通过控制器中的ID来查找用户。

从Rails 2.3开始,不可能更改参数名称并仍然使用
#resources
提供的自动路由

作为一种解决方法,您可以使用
:path\u前缀
:name\u前缀
映射
文章

map.resources :articles, :path_prefix => "/users/:login",
                         :name_prefix => "user_"
:path\u前缀
会影响URL,而
:name\u前缀
会影响生成的命名路由,因此您最终会得到以下路由:

    user_articles GET    /users/:login/articles(.:format)          {:controller=>"articles", :action=>"index"}
                  POST   /users/:login/articles(.:format)          {:controller=>"articles", :action=>"create"}
 new_user_article GET    /users/:login/articles/new(.:format)      {:controller=>"articles", :action=>"new"}
edit_user_article GET    /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"}
     user_article GET    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"show"}
                  PUT    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"update"}
                  DELETE /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"destroy"}
不过,作为一般的经验法则,我会坚持Rails的默认约定
:user\u id
,以及您在问题中发布的路由。一般认为,
:id
:user\u id
不一定意味着“数字标识符”——它们意味着“资源标识符”,不管是什么。通过坚持默认约定,您的代码对于在Rails中使用资源路由的任何人来说都将更容易理解


要对资源使用非数字标识符,只需在模型中将
#重新定义为_param
。然后,确保在控制器中使用一个查找器,该查找器将根据此标识符(而不是数字ID)进行查找,例如
User#find_by_login

p.s.我问这个问题主要是因为Merb的路由系统具有此功能。to_param尝试生成路由。但在识别时,它仍然将其作为:user\u id传入。是否可以将其重命名为:login?这是对另一个问题的书面回答:/此处的问题是关于路由器以及如何重命名
:id
路由参数。