表单助手,嵌套资源无需设置父资源
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 中的 new
和 edit
操作仅用于显示表单。这适用于嵌套和 non-nested 路由。
您还应该使用 model
选项,让 Rails 从传递的记录中推断出路线。 url
只应在必须打破惯例或使用没有模型的表单时使用。
参见:
如果我们的模型为:
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 中的 new
和 edit
操作仅用于显示表单。这适用于嵌套和 non-nested 路由。
您还应该使用 model
选项,让 Rails 从传递的记录中推断出路线。 url
只应在必须打破惯例或使用没有模型的表单时使用。
参见: