Rails哈希具有未知键和强参数

时间:2013-10-04 03:50:16

标签: ruby-on-rails ruby hash ruby-on-rails-4

我有一个rails应用程序,它将序列化哈希存储在名为properties的字段中。

哈希键虽然未知,所以我不知道如何通过强参数来允许它。

谷歌搜索时,我发现了这个:https://github.com/rails/rails/issues/9454,但我无法确切地知道解决方案是什么。

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

感谢您的帮助!

4 个答案:

答案 0 :(得分: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

如果您在:raise :log使用config.action_controller.action_on_unpermitted_parameters代替environment,请记得在致电{{{}}之前从properties删除params 1}}。那么方法将是

permit

答案 1 :(得分:5)

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

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

希望能有所帮助。

答案 2 :(得分:1)

您可以使用哈希而不是符号来定义允许的子属性。 这可以在源代码中看到:

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

e.g。

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

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

e.g。

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

答案 3 :(得分:-1)

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

在这种情况下,我们确实不知道密钥,所以不需要在那里进行强参数检查。这将解决您的问题