如何在具有嵌套属性的 Rails 控制器中使用 restore_attributes?

How to use restore_attributes in a Rails controller with nested attributes?

示例: 一个 Person 模型 accepts_nested_attributes_for 一个 Pets 模型,如示例中找到的 here。提交带有嵌套 fields_for :petsform_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 %>