ruby-on-rails - 在 Rails 的单个 View 中为模型创建多个记录

标签 ruby-on-rails simple-form

我有一个名为 Book 的模型,我想调整标准 Book#new 以显示 10 本书的字段,以便一次创建 10 本而不是只有一个。

我看了this question并发现如果我将 10.times 添加到我的表单中,我可以重复该表单。但是,我没有正确执行,因为保存了一条新记录,但所有字段都为空。

我想做的是:

  1. 允许用户一次最多输入 10 本书,然后保存
  2. 如果用户只填充三个图书记录,则只创建三个(并忽略 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/

相关文章:

ruby-on-rails - rails 嵌套路由的简单形式

ruby-on-rails - 部署到 Heroku 后,无法通过 Devise 登录

ruby-on-rails - 在 SQLite Ruby on Rails 中查看表数据

ruby-on-rails - Rails - 自定义 html 到 simple_form 标签

ruby-on-rails - 在 Ruby on Rails 中以 simple_form 添加字符计数器

ruby-on-rails - Rails 4 simple_form has_many 通过复选框不保存

ruby-on-rails - 如何以网格形式输出变量的内容?

css - 如何使用来自 Rails Controller 的样式表进行响应?

ruby-on-rails - 使用 Ruby on Rails 根据时间间隔发送电子邮件

ruby-on-rails - Rails - 如何在编辑模式下渲染嵌套表单部分