如何重命名默认标识符param“ id”在Rails的map.resources()中?
-
03-07-2019 - |
题
我喜欢Rail的 map.resources 生成的所有默认路由。但是,有些情况下我想在我的路线中使用非数字标识符。例如,如果嵌套路由由用户及其文章组成,则可以按如下方式编写标准路由:
map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'
但是,有许多优点/理由不使用Rails生成的默认数字标识符。有没有办法将default:id params替换为我选择的另一个规范标识符,而不会为每个标准操作编写自定义路由?如果我想要一个以下格式的路线:
'/users/:login/articles/:id'
这种路线是否可以使用 map.resources ?
实现解决方案
从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"}
但是,作为一般的经验法则,我会坚持:user_id
的Rails默认约定,以及您在问题中发布的路由。通常理解:id
和:user_id
并不一定意味着“数字标识符”。 —它们意味着“资源标识符”,无论可能是什么。通过坚持默认约定,对于在Rails中使用资源路由的任何人来说,您的代码将更容易理解。
要为资源使用非数字标识符,只需在模型中重新定义 #to_param
即可。然后,确保在控制器中使用可通过此标识符(而不是数字ID)查找的查找程序,例如 User#find_by_login!
。
其他提示
您可以通过覆盖模型中的to_param来更改在URL中使用ID的默认设置。 e.g。
class User < ActiveRecord::Base
def to_param
login
end
end
user_articles_path(@user) => "/users/:login/articles"
您需要做的唯一其他更改是通过登录而不是控制器中的ID来查找用户。
不隶属于 StackOverflow