Rails 4 个自定义命名路由未调用模型的正确 属性

Rails 4 custom named route not calling correct property of model

根据 http://edgeguides.rubyonrails.org/routing.html#overriding-named-route-parameters,我定义了一个带有自定义命名路由参数而不是 :id 的路由来创建友好的 URL。 routes.rb 看起来像:

resources :spaces, param: :name

运行 rake routes 确实给出了带有动态段的正确路径:

space GET    /spaces/:name(.:format)                spaces#show

但使用 space_path 仍会尝试检索 ID:

irb(main):009:0> app.space_path space
=> "/spaces/1"

是否应该给出“/spaces/foo”(假设 Space 和 id=1name=foo

我可以明确地做到:

irb(main):009:0> app.space_path space.name
=> "/spaces/foo"

但后来我失去了动态路径的全部意义,我所有的观点都变得更加脆弱。动态路径是否应该无法识别要检索的 属性?

我知道我可以在模型中重写 to_params,但同样,这不是让模型变得脆弱吗?动态路径不应该识别动态段的名称并从模型中检索正确的 属性 吗?

app.space_path 将采用您提供的第一个参数并将其放在 :name 的位置。如果参数是一个 ActiveModel 实例,它将对其调用 to_param,除非您覆盖它,否则它将 return id 属性的值——在本例中为 1, 而不是 foo.

如果你想 app.space_path(space) 到 return /spaces/foo 你需要覆盖 Space#to_param:

class Space < ActiveRecord::Base
  # ...
  def to_param
    name
  end
end

你的路由中 :name 唯一要做的就是确定 params 中该值的键在你的控制器中,即如果请求 /spaces/fooparams[:name] 将是 "foo".