在Rails中,创建多个父母和子女的表单可以通过使用accepts_nested_attributes_for
方法和fields_for
方法来实现。
首先,在父母模型中定义accepts_nested_attributes_for
方法,并允许子女模型的属性。例如,如果父母模型是Parent
,子女模型是Child
,则可以在Parent
模型中添加以下代码:
class Parent< ApplicationRecord
has_many :children
accepts_nested_attributes_for :children, allow_destroy: true
end
这将允许在父母模型的表单中创建、更新和删除子女模型的记录。
接下来,在表单中使用fields_for
方法来创建子女模型的表单。例如,在ParentsController
的new
和edit
方法中,可以添加以下代码:
def new
@parent = Parent.new
3.times { @parent.children.build }
end
def edit
@parent = Parent.find(params[:id])
3.times { @parent.children.build }
end
这将为父母模型创建3个子女模型的实例。
然后,在表单中使用fields_for
方法来创建子女模型的表单。例如,在app/views/parents/_form.html.erb
文件中,可以添加以下代码:
<%= form_with(model: parent) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.fields_for :children do |child_form| %>
<%= child_form.label :name, "Child Name" %>
<%= child_form.text_field :name %>
<% end %>
<%= f.submit "Submit" %>
<% end %>
这将为每个子女模型创建一个表单,并在提交时将所有子女模型的数据一起保存到父母模型中。
最后,在ParentsController
中的create
和update
方法中,可以添加以下代码来处理表单提交:
def create
@parent = Parent.new(parent_params)
if @parent.save
redirect_to @parent
else
render :new
end
end
def update
@parent = Parent.find(params[:id])
if @parent.update(parent_params)
redirect_to @parent
else
render :edit
end
end
private
def parent_params
params.require(:parent).permit(:name, children_attributes: [:id, :name, :_destroy])
end
这将保存父母模型和子女模型的数据,并在出现错误时重新渲染表单。
总之,使用accepts_nested_attributes_for
和fields_for
方法可以轻松地在Rails中创建多个父母和子女的表单。
领取专属 10元无门槛券
手把手带您无忧上云