我有一个名为 Book
的模型,我想调整标准 Book#new
以显示 10 本书的字段,以便一次创建 10 本而不是只有一个。
我看了this question并发现如果我将 10.times
添加到我的表单中,我可以重复该表单。但是,我没有正确执行,因为保存了一条新记录,但所有字段都为空。
我想做的是:
- 允许用户一次最多输入 10 本书,然后保存
- 如果用户只填充三个图书记录,则只创建三个(并忽略 others 具有 null 值的形式的七个记录)
我的看法:
<%= simple_form_for(@book) do |f| %>
<%= f.error_notification %>
<% 10.times do |index|%>
<%= f.input :title %>
<%= f.association :book_category %>
<% end %>
<%= f.submit %>
<% end %>
我的 Controller 与脚手架代码没有变化:
def new
@book = Book.new
end
def create
@book = Book.new(params[:book])
end
最佳答案
您不能使用与其他方法相同的方法的原因 question在你的帖子中是 bc @book 不是用户的嵌套属性。您只是为一本新书创建一个表单,因此 Controller 中没有任何特殊内容,rails 只会保存一本书。一种选择是使书籍成为用户的嵌套属性,以便您可以一次创建多本书。以下是您需要如何设置模型和表单来处理嵌套属性。
Class User < ActiveRecord::Base
has_many :books
accepts_nested_attributes_for :books, :reject_if => lambda { |b| b[:title].blank? }
attr_accessible :books_attributes
end
Class Book < ActiveRecord::Base
belongs_to :user
end
reject_if
将忽略任何提交给 Controller 但没有标题的记录。你会想要这个,因为你假设许多用户不会使用所有 10 个字段。以下是您的表格。
<%= form_for @user do |f| %>
<%= f.fields_for :books, [Book.new]*10 do |book| %>
<%= book.text_field :title %>
<%= book.association :book_category %>
<% end %>
<%= f.submit %>
<% end %>
请务必注意,此表单将提交给用户 Controller ,因为它是一个用户表单。用户 Controller 将像处理用户的任何其他属性一样处理所有书籍的创建/更新,因为书籍现在被接受为嵌套属性。有关更多示例,请查看此 Railscast关于嵌套属性。
正如我上面提到的,这只是一种选择。如果您不想让 book 成为 user 的嵌套属性,那么另一种选择是像您已经在做的那样生成 10 组 book 输入字段,然后在 Books Controller 的 create 操作中分解 params 散列。通过这样做,您可以遍历哈希并为每组输入创建一本书。这比使用 accepts_nested_attributes_for
更“hacky”,但它是另一种选择,所以我想我会提到它。
关于ruby-on-rails - 在 Rails 的单个 View 中为模型创建多个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15304370/