如何配置 ActionController::Parameters 以允许中等深度的递归结构

问题描述 投票:0回答:2

我希望我的 JavaScript 前端将递归数据结构传递给我的 Rails API。 如何将参数配置为

permit
来处理未知深度的结构?

具体来说,我的数据结构描述了类别的层次结构。例如:

  • 1类
    • 类别 1a
    • 1b 类
      • 类别 1b1
      • 类别 1b2
    • 类别 1c
  • 2类
    • 2a 类
  • 第 3 类

发送到 API 的结果 JSON 将是

{name: "Category 1", subcategories: [ ...]}
形式的对象数组。其中
subcategories
对象也是
{ name: 'Foo', subcategories: [...]}
的数组 例如:

[{"name":"Teaching","subcategories":[{"name":"MTH 201","subcategories":[{"name":"Lecture"},{"name":"Prep"},{"name":"Grading"},{"name":"Office Hours","subcategories":[{"name":"In Person"},{"name":"Zoom"}]}]},{"name":"MTH 202","subcategories":[{"name":"Lecture"},{"name":"Prep"},{"name":"Grading"},{"name":"Office Hours","subcategories":[{"name":"In Person"},{"name":"Zoom"}]}]}]},{"name":"Scholarship"},{"name":"Service","subcategories":[{"name":"Meetings"},{"name":"Paperwork"}]}]

我能够成功地将深度硬编码为 3,如下所示:

permit(:name, subcategories: [:name, subcategories: [:name]]).to_h

但是,三个还不够深。有办法吗

  1. 允许特定的最大深度(例如 8),而不必像上面那样构建大规模的递归描述,或者

  2. 允许任意深度的输入?

ruby-on-rails strong-parameters
2个回答
1
投票

Rails 帮助程序无法做到这一点,您需要自己递归结构,检查是否只有您期望的键存在。


0
投票

这是我所做的(基于@smathy 的答案):

编写一个递归函数来构建固定深度的描述:

  def self.make_description(depth)
    if (depth <= 1)
      return [:name]
    else 
      return [:name, subcategories: make_description(depth -1)]
    end
  end

然后,将其应用于对

permit
的调用:

 params[:categoryHierarchy].permit(:name, CategoryController.make_description(8))

该解决方案创建了硬编码的最大深度;但是,我怀疑这在实践中会出现问题。 (我无法想象层级结构一旦增长到 4 或 5 级会有什么用处。)

© www.soinside.com 2019 - 2024. All rights reserved.