2

У меня есть вложенная форма, использующая драгоценный камень кокона, который содержит 5 классов в глубину. Все они принадлежат__и_и_и_о_о1о1о1, кроме одного, который является вторым в большинстве вложенных классов с ассоциацией has_one и belongs_to. Всякий раз, когда я его редактирую, он удаляется и воссоздает экземпляр (а не то, что я хочу) любые идеи?Разрушение ассоциации Has_one Редактировать

class FirmwaresController < ApplicationController 

    def index 
     @firmwares = Firmware.all 
    end 

    def new 
     @firmware = Firmware.new 
    end 

    def edit 
     @firmware = Firmware.find(params[:id]) 
    end 
end 


class Setting < ActiveRecord::Base 
    belongs_to :menu_item 
    has_many :selections, dependent: :destroy 
    has_many :dependencies 
    attr_accessible :kind, :name, :placement, :selections_attributes 
    accepts_nested_attributes_for :selections, reject_if: :all_blank, allow_destroy: true 
    validates_presence_of :kind 
end 

class MenuItem < ActiveRecord::Base 
    belongs_to :menu 
    belongs_to :dependency 
    has_one :setting, dependent: :destroy 
    attr_accessible :dependency_id, :menu_for, :name, :placement, :setting_attributes 
    accepts_nested_attributes_for :setting, reject_if: :all_blank, allow_destroy: true 
    validates_presence_of :name 

end 

_menu_items.html.haml

.row-fluid 
     .input-prepend  
      = f.input :name, label: "Menu Item Name" 
     .input-append 
      = f.input :placement, label: "Order in Menu (X.Y)", as: :string 
    = f.simple_fields_for :setting do |settings_form| 
     = render 'setting_fields', f: settings_form 
    %p 
     = link_to_add_association "Has Setting?", f, :setting, class: "btn btn-primary btn-small add_setting_link" 
     = link_to_remove_association 'Remove Menu Item', f, class: "btn btn-danger btn-small remove_menu_item" 

_setting_fields.html.haml

.row-fluid 
    .input-prepend 
     = f.input :kind, label: "Type", collection: setting_kinds, input_html: {class: "setting_type"} 
    .input-append 
     = link_to_remove_association 'Remove Setting', f, class: 'btn btn-danger btn-small remove_setting_link' 
.setting_selection{style: "display: none;"} 
    = f.simple_fields_for :selections do |selections_form| 
     = render 'selection_fields', f: selections_form 
    %p= link_to_add_association 'Add Selection Option', f, :selections, class: "btn btn-primary btn-small" 

ответ

3

Я предполагаю, что has_one ассоциация вы имеете в виду в MenuItemhas_one :setting. Если это так, вы можете попробовать добавить update_only: true в свои accepts_nested_attributes_for :setting. From the documentation (курсив мой):

По умолчанию: update_only опция false и вложенные атрибуты используются для обновления существующей записи, только если они включают в себя :id ценность записи, то. В противном случае новая запись будет создана и использована для замены существующей. Однако, если параметр: update_only равен true, вложенные атрибуты используются для обновления атрибутов записи всегда, независимо от того, присутствует ли :id.

2

Этот вопрос старый, но это может помочь некоторым людям:

Причина ассоциация всегда была воссоздана для меня было то, что я забыл включить :id в допустимых параметров phone_number_attributes! Если вы забудете это сделать, рельсы не будут получать идентификатор и воссоздают новую запись, чтобы заменить старую.

def user_params 
    params.require(:user).permit(
    :avatar, 
    :remove_avatar, 
    { id_photo_attributes: [:photo, :remove_photo] }, 
    { phone_number_attributes: [:id, :phone_number] } # dont forget :id here! 
) 
end 
Смежные вопросы