gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:53:57 25 4
gpt4 key购买 nike

我有一个名为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com