Rails中如何使用strong params允许嵌套哈希包含任意随机属性
解决方案
Rails的默认强参数校验逻辑中,book: []仅允许数组中包含标量值(字符串、数值、布尔值、空值),无法透传哈希类型的数组元素。你可以通过以下两种方式实现允许book数组内的哈希包含任意属性:
方案1:直接透传book参数(适配所有Rails版本,最稳妥)
修改article_params方法如下:
class ArticlesController < ApplicationController def create article = Article.new(article_params) # 后续保存逻辑 end private def article_params # 先允许常规的name、age参数 whitelisted = params.permit(:name, :age) # 单独处理book字段,确保是数组类型后透传全部内容 whitelisted[:book] = params[:book] if params[:book].is_a?(Array) whitelisted end end
如果需要额外过滤数组内的非哈希元素,可以调整为:
def article_params whitelisted = params.permit(:name, :age) if params[:book].present? && params[:book].is_a?(Array) whitelisted[:book] = params[:book].select { |item| item.is_a?(Hash) } end whitelisted end
方案2:Rails 6.1+ 简化写法
如果你使用Rails 6.1及以上版本,可以直接通过book: [{}]声明允许数组内哈希的所有属性:
def article_params params.permit(:name, :age, book: [{}]) end
注意事项
上述两种方案都会跳过book字段内部的参数校验,你需要自行确保传入的book内容不会引发安全风险,比如不要直接用该参数更新其他关联模型,避免参数注入问题。
内容的提问来源于stack exchange,提问作者Samuel Da Costa
相关产品推荐
相关产品推荐

