gpt4 book ai didi

ruby-on-rails - 从父表单创建一定数量的子对象

转载 作者:行者123 更新时间:2023-12-01 12:42:15 25 4
gpt4 key购买 nike

感谢Ruby on Rails: How to gather values for child tables from a form?和“敏捷 Web 开发”,我知道如何使用 fields_for 在一个表单中拥有多个模型。但我正在为这个而焦头烂额。

假设我有一个模型PersonPerson 有一个 name 属性,并且 has_many :foosFoo 模型又具有 colour 属性。

此外,我知道每个 Person 都有恰好三个 Foos。我的模型、PersonController 中的 newcreate 操作以及 new View 应该是什么样子,以便显示三个标签精美的文本输入框,每个 Foo 一个,能够报告验证错误,以允许我的“新人”表单一次性创建整套四个对象?

此外,我可以在没有 accepts_nested_attributes_for 的情况下执行此操作吗?

最佳答案

在尝试了方括号的不同位置和不同的 for 循环之后,我想我已经解决了这个问题。这是我的代码现在的样子(根据脚手架设置路由,因此从 /new 发布会触发 create)。

模型/person.rb

class Person < ActiveRecord::Base
has_many :foos
validates_presence_of :name
end

模型/foo.rb

class Foo < ActiveRecord::Base
belongs_to :person
validates_presence_of :colour
validates_uniqueness_of :colour, :scope => "person_id"
end

Controller /people_controller.rb

def new
# Set up a Person with 3 defaulted Foos
@person = Person.new
(1..3).each { |i| @person.foos.build }
end

def create
# Create (but don't save) a Person as specified
@person = Person.new(params[:person])

# Create (but don't save) a Foo for each set of Foo details
@foos = []
params[:foo].each do |foo_param|
@foos << Foo.new(foo_param)
end

# Save everything in a transaction
Person.transaction do
@person.save!
@foos.each do |foo|
foo.person = @person
foo.save!
end
end

redirect_to :action => 'show', :id => @person

rescue ActiveRecord::RecordInvalid => e
@foos.each do |foo|
foo.valid?
end
render :action => 'new'
end

views/people/new.html.erb

<% form_for :person do |f| %>
<%= error_messages_for :object => [@person] + @person.foos %>

<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>

<table>
<% @person.foos.each_with_index do |foo, index| @foo = foo%>
<tr>
<td><%= label :colour, "Foo colour #{index + 1}: " %></td>
<td><%= text_field("foo[]", "colour" %></td>
</tr>
<% end %>
</table>

<p>
<%= f.submit 'Create' %>
</p>
<% end %>

这似乎可以解决问题。

关于ruby-on-rails - 从父表单创建一定数量的子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2110857/

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