【发布时间】:2013-01-21 09:53:05
【问题描述】:
我有以下嵌套的单数路由:
resources :listings do
resource :logo, only: [ :edit, :update ]
end
它按预期生成了 2 条正确的路线:
edit_listing_logo GET /listings/:listing_id/logo/edit(.:format) logos#edit
listing_logo PUT /listings/:listing_id/logo(.:format) logos#update
现在当我重定向到 edit_listing_logo_path 时
redirect_to edit_listing_logo_path( @listing, @logo )
或者当我创建一个更新表单时
<%= form_for [ @listing, @logo ] do |f| %>
生成的链接总是像这样在末尾附加单个资源 ID
/listings/2/logo.1
我还没有在这个应用程序中使用响应格式,所以它工作正常。但是这个链接生成看起来很奇怪,如果与各种响应格式一起使用,我预计它会导致问题。
请注意,这里也讨论过 Rails Nested Singular Resource Routing 但我根本没有使用“显示”路径。
感谢您的任何意见。
【问题讨论】:
-
'edit' 和 'show' 路径的工作方式相同,因此您在提到的问题中获得了所需的一切!
-
为什么它们会以同样的方式工作?
-
对不起,这只是你答案的第一部分:你可以使用
redirect_to edit_listing_logo_path(@listing),因为如果你检查这一行:edit_listing_logo GET /listings/:listing_id/logo/edit(.:format) logos#edit,你可以看到:logo_id 在路线。对于第二部分,您可以添加显示路径并使用@Bryan Marble 回答。 -
好的.. 在重定向中,这可以
edit_listing_logo_path( @listing )工作,因为我们不需要徽标的 ID。 -
但我不得不将表单助手代码更改为
form_for @logo, url: listing_logo_path( @listing ), method: :put。这会生成正确的 /listings/2/logo PUT 操作。 IMOform_for [ @listing, @logo ] do |f|也应该生成相同的链接,所以我认为这是一个错误。在这种情况下,删除 @listing 或 @logo 没有帮助,因为它在这两种情况下都会尝试生成非嵌套路由。