Rails update_attributes вызывает дублирование объекта каждый раз, когда он попадает в действие контроллера обновления - PullRequest
0 голосов
/ 13 января 2020

Я использую Rails и Wicked Gem для создания многошаговой формы. У меня есть модель Родитель и ребенок. У родителей много детей, и родительская форма acceptpts_nested_attributes_for: children.

Я строю вложенный объект на действии SHOW контроллера, чтобы отображалось поле формы.

По какой-то причине, каждый раз, когда форма сохраняется, количество дочерних элементов в базе данных (и количество полей формы в представлении) удваивается. Сначала это спасет 1 ребенка, как и ожидалось. Затем, если я go вернусь, чтобы обновить эту часть формы и сохранить этот дочерний элемент, он создаст 2 дочерних элементов, затем 4 и т. Д. c.

Вот соответствующий код:

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

дети. 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 %>

1 Ответ

1 голос
/ 13 января 2020

Вам необходимо добавить child.id к возвращенному набору. Если рельсы не видят 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
...