我喜欢 Rail 生成的所有默认路线 map 资源 .但是,在某些情况下,我想在我的 route 使用非数字标识符。例如,如果有一个由用户和他们的文章组成的嵌套路由,标准路由可以写成这样:
map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'
但是,不使用 Rails 生成的默认数字标识符有很多优点/原因。有没有办法将默认的 :id params 替换为我选择的另一个规范标识符,而无需为每个标准操作编写自定义路由?假设我想要以下格式的路线:
'/users/:login/articles/:id'
使用 是否可以实现这种路线? map 资源 ?
最佳答案
从 Rails 2.3 开始,无法更改参数名称并仍然使用 #resources
的自动路由。提供。
作为解决方法,您可以映射 articles
与 :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
在你的模型中。然后,确保在您的 Controller 中使用一个通过这个标识符(而不是数字 ID)来查找的查找器,例如 User#find_by_login!
.
关于ruby-on-rails - 如何在 Rails 的 map.resources() 中重命名默认标识符参数 "id"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/810385/