从 Rails 2.3 开始,无法更改参数名称并仍然使用 #resources
提供的自动路由。
作为解决方法,您可以使用 :path_prefix
和 :name_prefix
映射 articles
:
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!
。