首页 > 解决方案 > 更新模型和 Child 删除 Grandchild :( Rails

问题描述

我有:

Initial_application.rb

has_one :full_application
has_one :statement, through: :full_application
accepts_nested_attributes_for :application_status
accepts_nested_attributes_for :full_application

完整应用程序.rb

has_one :statement
has_one :plaid_auth, through: :statement

语句.rb

has_many_attached :files
belongs_to :full_application, optional: true

所以我有 - initial_application - full_application(initial_application 的孩子) - 声明(full_application 的孩子,因此 initial_application 的孙子)

initial_application_controller.rb

def edit_full
  respond_to do |format|
  format.html
  format.js
  render layout: 'fullapplication_layout'
  end
end

我在控制器中创建了一个操作来更新初始应用程序和 full_application。创建一个嵌套表单等,放入强大的参数等。

def initial_application_params
  params.require(:initial_application).permit( :source, :amount, :years, :sales, :creditscore, :email, :name, :phone, :interest, :businessname, application_status_attributes: [:status, :person, :status_name, :status_description, :status_note], full_application_attributes: [:amount, :years, :sales, :creditscore, :email, :phone, :name, :defaults, :existingach, :acceptcc, :seasonal, :balance, :lender, :interest, :street, :apt, :city, :state, :zipcode, :businessname, :bstreet, :bapt, :bcity, :bstate, :bzipcode, :dba, :legalentity, :fedtaxid, :dob, :percentage, :own, :bown, :bphone, :analytics, :source, :credit_auth, :ip ] )
end

edit_full_form.erb

<%= simple_form_for @initial_application do |f| %>
...
<%= f.simple_fields_for :application_status do |p| %>
...
<% end %> 
<%= f.simple_fields_for :full_application do |m| %>
...
<% end %>
<%= f.button :submit, "Update Status", class: "button is-medium" %>
<% end %>

但是当我使用嵌套形式更新 initial_application 和 full_application 时,它会删除语句。我想出了问题,但我不知道如何解决。

“更新”操作是创建新的 full_application 记录,而不是更新旧的 full_application。

标签: ruby-on-railsnested

解决方案


您的 full_aplication 记录正在重新创建,因为您没有通过它的id. 正如文档所说:

对于每个没有键的散列,id将实例化一个新记录,除非散列还包含一个_destroy计算结果为 的键true

要修复它,您需要在:id允许的参数的嵌套列表中添加一个full_application_attributes,并将该 ID 作为 hidden_​​field 传递给表单。


推荐阅读