Rails update_attributes 导致 object 每次点击更新控制器操作时都会被复制
Rails update_attributes causing object to be duplicated every time it hits update controller action
我正在使用 Rails 和 Wicked Gem 创建一个 multi-step 表单。我有一个 Parent 和一个 Child 模型。 Parent有很多children,parents形式accepts_nested_attributes_for:children.
我正在控制器的 SHOW 操作上构建嵌套 object,以便显示表单字段。
出于某种原因,每次保存表单时,数据库中 children 的数量(以及视图中的表单字段数量)都会加倍。首先它将按预期保存 1 child。然后,如果我返回更新表格的那部分并保存 child,它会创建 2 children,然后是 4,等等
相关代码如下:
parent.rb
class Parent < ApplicationRecord
belongs_to :user
has_many :children
accepts_nested_attributes_for :children
end
child.rb
class Child < ApplicationRecord
belongs_to :parent
end
parent_steps_controller.rb
class ParentStepsController < ApplicationController
include Wicked::Wizard
steps :spouse, :children
def show
@user = current_user
if Parent.find_by(id: params[:parent_id])
@parent = Parent.find(params[:parent_id])
session[:current_parent_id] = @parent.id
else
@parent = Parent.find_by(id: session[:current_parent_id])
end
@parent.children.build
render_wizard
end
def update
@parent = Parent.find_by(id: session[:current_parent_id])
@parent.update_attributes(parent_params)
render_wizard @parent
end
private
def parent_params
params.require(:parent).permit(:spouse_name, :children_attributes => [:full_name])
end
end
children.html.erb
<%= form_for(@parent, :url=> wizard_path, :method => :put) do |f| %>
<h1>Children Information</h1>
<%= f.fields_for :children do |child| %>
<div class="field">
<%= child.label :full_name %>
<%= child.text_field :full_name %>
</div>
<% end %>
<%= f.submit "Continue", :class => "btn btn-primary" %>
<% end %>
您需要将 child.id
添加到返回的集合中。如果 rails 没有看到 ID,则假定这些是新记录。它不一定对您可见,但必须是表单的一部分。
<%= f.fields_for :children do |child| %>
<%= child.hidden_field :id %>
还要确保您的强参数允许 :id
为 children_attributes
部分传递。
def parent_params
params.require(:parent).permit(:spouse_name, :children_attributes => [:id, :full_name])
end
我正在使用 Rails 和 Wicked Gem 创建一个 multi-step 表单。我有一个 Parent 和一个 Child 模型。 Parent有很多children,parents形式accepts_nested_attributes_for:children.
我正在控制器的 SHOW 操作上构建嵌套 object,以便显示表单字段。
出于某种原因,每次保存表单时,数据库中 children 的数量(以及视图中的表单字段数量)都会加倍。首先它将按预期保存 1 child。然后,如果我返回更新表格的那部分并保存 child,它会创建 2 children,然后是 4,等等
相关代码如下:
parent.rb
class Parent < ApplicationRecord
belongs_to :user
has_many :children
accepts_nested_attributes_for :children
end
child.rb
class Child < ApplicationRecord
belongs_to :parent
end
parent_steps_controller.rb
class ParentStepsController < ApplicationController
include Wicked::Wizard
steps :spouse, :children
def show
@user = current_user
if Parent.find_by(id: params[:parent_id])
@parent = Parent.find(params[:parent_id])
session[:current_parent_id] = @parent.id
else
@parent = Parent.find_by(id: session[:current_parent_id])
end
@parent.children.build
render_wizard
end
def update
@parent = Parent.find_by(id: session[:current_parent_id])
@parent.update_attributes(parent_params)
render_wizard @parent
end
private
def parent_params
params.require(:parent).permit(:spouse_name, :children_attributes => [:full_name])
end
end
children.html.erb
<%= form_for(@parent, :url=> wizard_path, :method => :put) do |f| %>
<h1>Children Information</h1>
<%= f.fields_for :children do |child| %>
<div class="field">
<%= child.label :full_name %>
<%= child.text_field :full_name %>
</div>
<% end %>
<%= f.submit "Continue", :class => "btn btn-primary" %>
<% end %>
您需要将 child.id
添加到返回的集合中。如果 rails 没有看到 ID,则假定这些是新记录。它不一定对您可见,但必须是表单的一部分。
<%= f.fields_for :children do |child| %>
<%= child.hidden_field :id %>
还要确保您的强参数允许 :id
为 children_attributes
部分传递。
def parent_params
params.require(:parent).permit(:spouse_name, :children_attributes => [:id, :full_name])
end