我有一个名为Book
的模型,我想调整标准Book#new
以显示10本书的字段,这样就可以一次创建10个而不只是一个。
我查看了this question,发现如果我将10.times
添加到表单中,我可以重复该表单。但是,我没有正确执行,因为保存了新记录,但所有字段都为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 %>
我的控制器与脚手架代码没有变化:
def new
@book = Book.new
end
def create
@book = Book.new(params[:book])
end
答案 0 :(得分:12)
你不能在帖子中使用与其他question相同的方法的原因是bc @book不是用户的嵌套属性。您只是为一本新书创建一个表单,因此在控制器中没有任何特殊内容,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
将忽略在没有标题的情况下提交给控制器的任何记录。你会想要这个,因为你假设许多用户不会使用所有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 %>
请务必注意,此表单将提交给Users控制器,因为它是用户表单。用户控制器将处理创建/更新所有书籍,就像用户的任何其他属性一样,因为书籍现在被接受为嵌套属性。有关更多示例,请在嵌套属性上检查此Railscast。
正如我上面提到的,这只是一个选择。如果您不想将book设置为用户的嵌套属性,那么另一个选项是生成您已经在做的10组书籍输入字段,然后在Books控制器中的create动作中拆分params哈希。通过这样做,您可以遍历哈希并为每组输入创建一本书。这比使用accepts_nested_attributes_for
更加“hacky”,但这是另一种选择,所以我想我会提到它。
答案 1 :(得分:2)
您引用的示例文章讨论的是嵌套模型表单。 Railscasts还有一个视频:http://railscasts.com/episodes/196-nested-model-form-part-1
两者都指的是与其他模型有关系的模型的单个实例。
您要做的是同一模型的多个实例,而不是嵌套关系。
我的问题是,为什么?他们是否真的节省了从一个字段集到另一个字段集的时间,而不是按Enter键提交单个记录?
如果您想节省数据输入的时间,为什么不将create
操作重定向回新设置,以便他们可以立即输入下一条记录?或者在提交每条记录后使用AJAX向页面添加新的字段集?
我认为这些方法可以让你的视图和控制器保持良好和RESTful。