如何用Strong Params允许同时包含字符串和对象的数组?
解决Rails中混合标量与对象的数组参数许可问题
Rails的ActionController::Parameters#permit方法默认不支持同时包含标量值和哈希对象的混合数组——数组的许可规则只能指定单一类型:要么是标量集合(用[]),要么是结构化哈希的集合(用属性列表如[:start, :end])。你尝试的schedule: [[:start, :end], []]不符合permit的语法规范,因此只会保留匹配哈希类型的元素,标量值被过滤掉。
解决方案1:手动遍历处理混合数组
通过遍历数组元素,根据类型分别处理标量和哈希对象,既能保留标量值,也能正确许可哈希的属性:
params = ActionController::Parameters.new( schedule: ['2022-07-04', { start: '2022-12-24', end: '2022-12-31' }] ) # 处理schedule数组的每个元素 permitted_schedule = params[:schedule].map do |item| if item.is_a?(ActionController::Parameters) item.permit(:start, :end) else item # 标量直接保留 end end # 组装成最终的许可参数 permitted_params = params.permit().tap do |p| p[:schedule] = permitted_schedule end.to_h # 输出结果:{"schedule"=>["2022-07-04", {"start"=>"2022-12-24", "end"=>"2022-12-31"}]}
解决方案2:使用permit!(谨慎使用)
如果完全信任参数来源,可以直接用permit!绕过所有许可检查,一次性保留所有参数:
params = ActionController::Parameters.new( schedule: ['2022-07-04', { start: '2022-12-24', end: '2022-12-31' }] ).permit! params.to_h # => {"schedule"=>["2022-07-04", {"start"=>"2022-12-24", "end"=>"2022-12-31"}]}
⚠️ 注意:permit!会关闭所有参数安全检查,仅适用于你能确保输入完全安全的场景,否则可能带来批量赋值风险。
内容的提问来源于stack exchange,提问作者pragmatic_programmer
相关产品推荐
相关产品推荐

