我希望我的 JavaScript 前端将递归数据结构传递给我的 Rails API。 如何将参数配置为
permit
来处理未知深度的结构?
具体来说,我的数据结构描述了类别的层次结构。例如:
发送到 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
但是,三个还不够深。有办法吗
允许特定的最大深度(例如 8),而不必像上面那样构建大规模的递归描述,或者
允许任意深度的输入?
Rails 帮助程序无法做到这一点,您需要自己递归结构,检查是否只有您期望的键存在。
这是我所做的(基于@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 级会有什么用处。)