【问题标题】:Rails Nested Singular Resource Routing Appending .IDRails 嵌套单一资源路由附加 .ID
【发布时间】: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 操作。 IMO form_for [ @listing, @logo ] do |f| 也应该生成相同的链接,所以我认为这是一个错误。在这种情况下,删除 @listing 或 @logo 没有帮助,因为它在这两种情况下都会尝试生成非嵌套路由。

标签: ruby-on-rails-3 routes


【解决方案1】:

我相信您可以通过使用详细路径方法edit_listing_logo_path(@listing)(如@Martin Sojka 所述)或使用符号而不是对象本身来获得所需的答案。

所以不要使用普通形式:

form_for [ @listing, @logo ]

您可以通过以下方式处理对象特异性(和尾随 ID):

form_for [@listing :logo]

如果你想在控制器上调用另一个动作,你可以在数组中添加前缀:

form_for [:edit, @listing :logo]

希望它对您有用 - 它似乎解决了我的问题。

【讨论】:

  • 是的,它使用第二个对象的 id 并将其附加为请求 URL 的格式。对象 ID 是不必要的,因为它是单一资源。
  • 我认为您在第二个和第三个示例中缺少,。此外,无论是否使用 Rails 5 中的逗号,它似乎都不起作用。
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多