假设我有2个型号,Box.rb和Toy.rb. Rails为我提供了独立创建新玩具和盒子的页面和方法。但是,我想确保/提供在第一次创建盒子时创建盒子的第一个玩具的能力。
与DRY一致,我想简单地将<%= render "Toy/form" %>
放在为_form.html.erb
生成的Box
文件中。
问题在于,玩具的_form
文件包含form_for
方法,原因很明显。对于我想要做的事情来说这是一个问题,因为我最终会将1个表格嵌套在另一个表格中,而我真正想要的是在保持DRY的同时获取玩具字段......?
答案 0 :(得分:1)
您应该使用accepts_nested_attributes_for
和fields_for
。假设您的关联是这样的
#box.rb
Class Box < ActiveRecord::Base
has_many :toys
accepts_nested_attributes_for :toys
end
#toy.rb
Class Toy < ActiveRecord::Base
belongs_to :box
end
#box_controller.rb
def new
@box = Box.new
@toy = @box.toys.build
end
def create
@box = Box.new(box_params)
if @box.save
-----
else
-----
end
end
private
def box_params
params.require(:box).permit(:box_attribute_1,:box_attribute_2,:more_box_attributes, toys_attributes: [:toy_attribute_1,:more_toy_attributes])
end
在box/form
中,您可以这样做
<%= form_for(@box) do |f| %>
<div class="field">
<%= f.label :box_attribute_1 %><br />
<%= f.text_field :box_attribute_1 %>
</div>
<div class="field">
<%= f.label :box_attribute_2 %><br />
<%= f.text_field :box_attribute_2 %>
</div>
<div class="field">
<%= f.label :box_attribute_3 %><br />
<%= f.text_field :box_attribute_3 %>
</div>
<%= f.fields_for @toy do |builder| %>
<%= render 'toys/form', :f => builder %>
<% end %>
<% end %>