使用accepts_nested_attributes_for时更改父对象

时间:2019-03-28 14:18:47

标签: ruby-on-rails activerecord ruby-on-rails-5 accepts-nested-attributes

我有带有menu_items的菜单,这些menu_items可以打开更多菜单。因此,您可以看到打开更深层菜单的菜单项的嵌套层次结构。问题是,但是GUI是拖放式的,我希望我的用户能够将菜单项从一个菜单拖动到另一个菜单。

我的数据结构是

menu.rb

has_many: menu_items
has_one :menu_item, foreign_key: :submenu_id, dependent: :nullify
accepts_nested_attributes_for :menu_items, allow_destroy: true

menu_item.rb

  belongs_to :menu
  belongs_to :submenu, class_name: 'Menu'
  accepts_nested_attributes_for :submenu, allow_destroy: true

有了这个,我可以使menu_item属于一个菜单并指向一个新菜单。在我的menu_params中给我这个:

 def menu_params
    params.require(:menu).permit(
      :id,
      :title,
      :menu_type,
      menu_items_attributes: [
        :id,
        :menu_id,
        :order,
        :title,
        :_destroy,
        submenu_attributes: [
          :id,
          :title,
          :menu_type,
          menu_items_attributes: [
            :id,
            :menu_id,
            :order,
            :title,
            :active,
            :_destroy,
            submenu_attributes: [
              :id,
              :title,
              :menu_type,
              menu_items_attributes: [
                :id,
                :menu_id,
                :order,
                :title,
                :active,
                :_destroy,
              ]
            ]
          ]
        ]
      ]
    )
  end

现在,在创建新的menu_item或更改其顺序时,一切正常。我遇到的问题是,如果我将menu_item从一个菜单移动到另一个菜单。似乎活动记录会根据其ID和父菜单ID来复合搜索menu_item。由于该父菜单ID在新响应中已更改,因此我得到:

Couldn't find MenuItem with ID=104 for Menu with ID=22

(因此menu_item以前属于菜单21,但我已将其拖到UI中,位于菜单22下的新位置。但是它仍然仅从旧位置查找)

是否有解决方案,它将看到嵌套的menu_item并仅根据其ID找到它,然后更新父menu_id的字段?

0 个答案:

没有答案