从 Rails 2.3 开始,无法更改参数名称并仍然使用自动路由#resources
提供。
作为解决方法,您可以映射articles
with a :path_prefix
and :name_prefix
:
map.resources :articles, :path_prefix => "/users/:login",
:name_prefix => "user_"
The :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
and :user_id
不一定意味着“数字标识符”——它们意味着“资源标识符”,无论它是什么。通过坚持默认约定,您的代码对于在 Rails 中使用资源路由的任何人来说都将更容易理解。
要对资源使用非数字标识符,只需重新定义#to_param
在你的模型中。然后,确保在控制器中使用查找器,该查找器将通过此标识符(而不是数字 ID)进行查找,例如User#find_by_login!
.