表单助手,嵌套资源无需设置父资源

Form helper, nested resources without setting the parent resource

如果我们的模型为:

class Book < ApplicationRecord
  has_many :chapters
end

class Chapter < ApplicationRecord
  belongs_to :book
end

路线:

resources :books do
  resources :chapters
end

我们想创建一个表单:

<%= form_with(url: new_book_chapter_url(chapter) do |f| %>

我们如何在不设置 book id 的情况下创建这种表单 (/books/:id/chapters/new)?

上面的例子会抛出:

No route matches {:action     => "new",
                  :book_id    => nil,
                  :controller => "chapter"},
missing required keys: [:book_id]

在我的例子中,用户在表单中设置了希望的 book,当表单出现时我希望它是 blank

这里有几个问题,我认为您没有真正理解 Rails 中 RESTful 路由的基础知识,或者应该使用什么嵌套路由。

如果您想在不在表单操作中指定书籍的情况下创建章节,那么您不应该使用嵌套路由。只需声明一条 non-nested 路线。

resources :chapters, only: [:create]
<%= form_with(model: chapter) do |f| %>
  <div class="field">
    <%= f.label :book_id, "Select a book" %>
    <%= f.collection_select :book_id, Book.all, :id, :name %>
  </div>
<% end %>

创建资源时,您 ​​POST 到集合路径 (/chapters) 而不是 (/chapters/new)。 Rails 中的 newedit 操作仅用于显示表单。这适用于嵌套和 non-nested 路由。

您还应该使用 model 选项,让 Rails 从传递的记录中推断出路线。 url 只应在必须打破惯例或使用没有模型的表单时使用。

参见: