当我已经设置了 URL 时,为什么我的嵌套资源表单试图使用不存在的路径方法?

Why is my nested resource form trying to use a non-existent path method when I've already set the URL?

我在我的应用程序中定义了以下路由:

resources :users do
  resources :data_sets
end

从以下 link 访问表单 data_sets/new

<%= link_to "New Data Set", new_user_data_set_path(user) %>

表单定义如下:

<%= form_with model: @data_set, url: [@data_set.author, @data_set] do |form| %>
  <!-- form contents... -->
<% end %>

表单在加载时出现以下错误:

Showing .../app/views/data_sets/new.html.erb where line #1 raised:

undefined method `data_sets_path' for #<#<Class:0x00007ffd2d1dcf90>:0x00007ffd292a63d0>

传递了以下参数:

{ "user_id" => "1" }

此处发布的类似问题似乎表明定义 URL 通常可以解决嵌套资源表单的问题,但如您所见,我已经解决了。这里还有什么事?

form_with 帮助程序根据您传递的数组构建嵌套的 url。但是在新记录的情况下,@data_set.author returns nil 并且表单试图到达不存在的 data_sets_path

如果您的表单仅用于 "new" 操作,您可以这样写:

<%= form_with model: @data_set, url: [:user, @data_set] do |form| %>

如果你在"new"和"edit"之间共享表格,你可以这样写一个条件:

<%= form_with model: @data_set, url: [(@data_set.new_record? ? :user : @data_set.author), @data_set] do |form| %>