ruby-on-rails - 如何在 Rails 的 map.resources() 中重命名默认标识符参数 "id"?

标签 ruby-on-rails resources routes params

我喜欢 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/

相关文章:

ruby-on-rails - Rails 服务器没有启动?

java - 使用配置文件中的 Maven 复制并覆盖一些资源

php - 限制共享主机上 IP 的资源使用

ruby-on-rails - 处理 "composed classes"

ruby-on-rails - 使用嵌套资源或在资源上有一个集合

ruby-on-rails - 类型错误 : ActiveSupport is not a class

c# - 如何使用包含资源值的IController Execute()返回View?

node.js - 为什么 req.params 返回 'undefined' ?

ruby-on-rails - 新路线 link_to 在一个地方工作但在另一个地方不起作用

ruby-on-rails - Rails 应用程序中没有 tmp/restart.txt 文件