Search code examples
ruby-on-railsupdate-attributes

Rails double the records on update_attributes


My update function double the records for nested items in model on submit.

The one, which is NOT in the fields_for works as expecting, but every record in fields_for is doubling.

What am I missing? Any help will be highly appreciated

  def edit
    @printer = Printer.find(params[:id])
  end

  def update
    @printer = Printer.find(params[:id])
    if @printer.update_attributes(printer_params)
      redirect_to @printer
    else
      render 'edit'
    end
  end

def printer_params
  params.require(:printer).permit(:model, colors_attributes: [:color], materials_attributes: [:material], printer_photos_attributes: [:image_url] )
end

edit.html.erb

  <%= form_for @printer, html: { multipart: true }, :url => url_for(:controller => 'printers', :action => 'update') do |p|%>

      <%= p.text_field :model %>

      <%= p.fields_for :colors do |color|%>
          <%= color.text_field :color %>
      <% end %>

      <%= p.submit "Edit" %>
  <% end %>

Solution

  • You are missing :id in printer_params. Without :id each your update for nested params is considered to be a new record. It should be as following for your colors_attributes:

    def printer_params
      params.require(:printer).permit(:model, colors_attributes: [:id, :color], materials_attributes: [:material], printer_photos_attributes: [:image_url] )
    end
    

    I guess, you should also correct your other nested attributes in this method.