2

我有一个嵌套形式,使用深度为 5 类的茧宝石。它们都是belongs_to 和has_many,除了具有has_one 和belongs_to 关联的嵌套最多的第二个类。每当我编辑它时,它都会被删除并重新创建一个实例(不是我想要的)任何想法?

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"
4

2 回答 2

3

我假设has_one您所指的关联是has_one :settingin MenuItem。如果是这样,您可以尝试添加update_only: true您的accepts_nested_attributes_for :setting选项。从文档(强调我的):

默认情况下 :update_only 选项是false,并且嵌套属性仅在包含记录值时才用于更新现有记录:id否则,将实例化一条新记录并用于替换现有记录。但是,如果 :update_only 选项为true,则嵌套属性始终用于更新记录的属性,无论 是否:id存在。

于 2013-10-07T18:26:47.910 回答
2

这个问题很老,但这可以帮助一些人:

总是为我重新创建关联的原因是我忘记:id在允许的参数中包含phone_number_attributes! 如果您忘记这样做,rails 将不会获取 id 并会重新创建一个新记录来替换旧记录。

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
于 2015-02-10T15:11:01.100 回答