从 Rails 2.3 开始,无法更改参数名称并仍然使用#resources
提供的自动路由。
作为一种解决方法,您可以articles
使用 a:path_prefix
和进行映射:name_prefix
:
map.resources :articles, :path_prefix => "/users/:login",
:name_prefix => "user_"
:path_prefix
影响 URL,并影响生成的:name_prefix
命名路由,因此您最终会得到这些路由:
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_id
,以及您在问题中发布的路由。人们普遍理解,:id
并不:user_id
一定暗示“数字标识符”——它们暗示“资源标识符”,不管它可能是什么。通过坚持默认约定,任何在 Rails 中使用资源路由的人都更容易理解您的代码。
要为资源使用非数字标识符,只需#to_param
在模型中重新定义。然后,确保在控制器中使用查找器,该查找器将通过此标识符(而不是数字 ID)查找,例如User#find_by_login!
.