【问题标题】:Fetch params from controller when nesting attributes 2 levels deep嵌套属性 2 层深时从控制器获取参数
【发布时间】:2023-03-23 15:25:02
【问题描述】:

我的Pack 模型有行,这些行又包含项目,并且包和行都接受它们包含的集合的嵌套属性。

以下是模型:

Class Pack < ApplicationRecord
   has_many :pack_lines, dependent: :destroy
   accepts_nested_attributes_for :pack_lines, allow_destroy: true
end

Class PackLine < ApplicationRecord
   belongs_to :pack
   has_many :pack_line_items, dependent: :destroy
   accepts_nested_attributes_for :pack_line_items, allow_destroy: true
end

Class PackLineItem < ApplicationRecord
   belongs_to :pack_line
end

我花了很长时间才找到正确的语法来使用 permit 控制器中的嵌套嵌套参数。

【问题讨论】:

  • 我最初是作为一个问题开始的,但我最终设法解决了我的问题,所以我发布了结果。而库马尔的回复,其实展示了一个更简单的方法。问题是:“我如何允许已经嵌套的对象的嵌套参数?”

标签: ruby-on-rails nested-attributes strong-parameters


【解决方案1】:

您可以允许这样的嵌套属性。

params.require(:pack).permit(
  :name,
  pack_lines_attributes: [
    :id, :_destroy, pack_line_items_attributes: [
         :id, :_destroy
    ]
  ]
)

has_manyhas_one 的工作方式类似。在has_one 的情况下,您可能需要单数化,例如pack_line_attributes [:id]

【讨论】:

    【解决方案2】:

    经过大量的头疼和文档阅读,这是我想出的:

    # In controllers/packs_controller.rb
    def pack_params
       params.require(:pack).permit(
          :name,
          pack_lines_attributes: [
             :id,
             :_destroy,
             {
               pack_line_items_attributes: [
                 :id,
                 :_destroy
               ]
             }
          ]
       )
    end
    

    希望有帮助!

    【讨论】:

    • 为什么{} 里面有pack_lines_attributes??
    • @Kumar 你绝对是对的! {} 是我在生成订单项时遇到的不正确索引问题遗留下来的。你的回答比我自己的好:-)
    猜你喜欢
    • 2016-06-11
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2019-04-17
    • 1970-01-01
    • 2016-07-20
    相关资源
    最近更新 更多