如何在具有嵌套属性的 Rails 控制器中使用 restore_attributes?
How to use restore_attributes in a Rails controller with nested attributes?
示例:
一个 Person
模型 accepts_nested_attributes_for
一个 Pets
模型,如示例中找到的 here。提交带有嵌套 fields_for :pets
的 form_for(@person)
会触发 PeoplesController 中的更新方法。如果保存不成功,即由于宠物名称未通过 presence: true
验证,如何使用 ActiveModel::Dirty 恢复对宠物实例所做的更改,从而恢复所做的更改
在表格中?我想这样做,以便嵌套的表单输入将保留他们预先保存的宠物值,而不是空白。
示例:
def update
@person = Person.find(params[:id])
respond_to do |format|
if @person.update_attributes(person_params)
format.html { redirect_to persons_path }
else
# @person.restore_attributes works for restoring the @person
# input values. I would like to do something like
# @person.pet.restore_attributes
format.html { render :edit }
end
end
end
我想出了一个方法来完成这件事。当使用嵌套 fields_for 时,您可以访问该表单中的对象,因此您可以对其调用 restore_attributes 等。
一个粗略的例子:
<%= form_for(@person) do |f| %>
<%= f.fields_for :pets do |ff| %>
<%
if ff.object.errors
ff.object.restore_attributes
end
%>
<% end %>
<% end %>
示例:
一个 Person
模型 accepts_nested_attributes_for
一个 Pets
模型,如示例中找到的 here。提交带有嵌套 fields_for :pets
的 form_for(@person)
会触发 PeoplesController 中的更新方法。如果保存不成功,即由于宠物名称未通过 presence: true
验证,如何使用 ActiveModel::Dirty 恢复对宠物实例所做的更改,从而恢复所做的更改
在表格中?我想这样做,以便嵌套的表单输入将保留他们预先保存的宠物值,而不是空白。
示例:
def update
@person = Person.find(params[:id])
respond_to do |format|
if @person.update_attributes(person_params)
format.html { redirect_to persons_path }
else
# @person.restore_attributes works for restoring the @person
# input values. I would like to do something like
# @person.pet.restore_attributes
format.html { render :edit }
end
end
end
我想出了一个方法来完成这件事。当使用嵌套 fields_for 时,您可以访问该表单中的对象,因此您可以对其调用 restore_attributes 等。
一个粗略的例子:
<%= form_for(@person) do |f| %>
<%= f.fields_for :pets do |ff| %>
<%
if ff.object.errors
ff.object.restore_attributes
end
%>
<% end %>
<% end %>