6

我有一个 Rails 应用程序,它将序列化的哈希存储在一个名为properties.

不过,哈希键是未知的,所以我不知道有一种方法可以使用强参数来实现这一点。

谷歌搜索时,我发现了这个:https ://github.com/rails/rails/issues/9454 ,但我无法弄清楚解决方案到底是什么。

所以基本上,我的问题是:如何配置强参数以允许具有未知键的哈希?

感谢大家的帮助!

4

4 回答 4

6

我最近遇到了同样的问题,我使用https://github.com/rails/rails/issues/9454中的@fxn 方法解决了这个问题

对于带有properties哈希的产品,将其解决为

def product_params
  params.require(:product).permit(:title, :description).tap do |whitelisted|
    whitelisted[:properties] = params[:product][:properties]
  end
end

如果你在你的then 中使用:raise而不是:logfor ,请记住在调用之前删除from 。然后方法将是config.action_controller.action_on_unpermitted_parametersenvironmentpropertiesparamspermit

def product_params
  properties = params[:product].delete(:properties)
  params.require(:product).permit(:title, :description).tap do |whitelisted|
    whitelisted[:properties] = properties
  end
end
于 2014-07-15T07:16:06.440 回答
6

这些答案都不适合我(使用 Rails 4.2.4),所以我想出了以下解决方法:

def product_params properties_keys = params[:product][:properties].keys params.require(:product).permit(:title, :description, properties: properties_keys) end

希望对某人有所帮助。

于 2015-12-21T20:24:49.540 回答
2

您可以使用散列代替符号并定义允许的子属性。这可以在源代码中看到:

case filter
when Symbol, String
  permitted_scalar_filter(params, filter)
when Hash
  hash_filter(params, filter)
end

https://github.com/rails/rails/blob/bdc73a438a97f2e0aceeb745f4a95f95514c4aa6/actionpack/lib/action_controller/metal/strong_parameters.rb#L522

例如

def user_params
  params.require(:person).permit(:name, :description, :age, properties: [:key, :value])
end

如果你不知道里面会有什么,properties你可以使用.slice。请注意,这也将接受嵌套在任何其他字段中的任何内容。

例如

def user_params
  params.require(:person).slice(:name, :description, :age, :properties) 
end

这些方法将适用于以下参数:

{
  "person": {
    "name": "John",
    "description": "has custom_attributes",
    "age": 42,
    "properties": [
      {
        "key": "the key",
        "value": "the value"
      }
    ]
  }
}

我已经确认这些将起作用Rails 4.2.6

于 2017-06-21T10:31:00.680 回答
-2

您的需求与强参数的目标完全相反,当我们定义强参数时,基本上我们会将即将到来的参数列入白名单。

在您的情况下,我们完全不知道密钥,因此无需在那里进行强大的参数检查。这将解决你的问题

于 2013-10-04T04:14:33.923 回答