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=1
有 name=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/foo
,params[:name]
将是 "foo"
.
根据 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=1
有 name=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/foo
,params[:name]
将是 "foo"
.