如何配置ActionController::Parameters许可深度递归结构
Rails API递归分类参数许可方案
1. 指定最大深度(如8层)
不用手动硬编码多层嵌套,写个递归辅助方法生成对应深度的permit规则即可:
# 控制器内的辅助方法 def recursive_permit_rules(depth) depth <= 1 ? [:name] : [:name, subcategories: recursive_permit_rules(depth - 1)] end # 参数许可逻辑 def category_params params.require(:category).permit( :name, subcategories: recursive_permit_rules(7) ).to_h end
这里传入7是因为外层的分类是第1级,subcategories递归7次后就能支持到第8级分类,按需调整数字即可。
2. 允许任意深度输入
通过递归引用的permit规则实现,让Rails自动处理所有层级的嵌套:
def category_params params.require(:category).permit(*permit_rules).to_h end private def permit_rules [:name, subcategories: permit_rules] end
注意事项:
- 仅在前端可信的场景下使用,防止恶意提交超深层嵌套数据引发性能问题
- 如果有层级限制需求,优先选择第一种指定最大深度的方案
内容的提问来源于stack exchange,提问作者Zack
相关产品推荐
相关产品推荐

