我有一个rails应用程序,它将序列化哈希存储在名为properties
的字段中。
哈希键虽然未知,所以我不知道如何通过强参数来允许它。
谷歌搜索时,我发现了这个:https://github.com/rails/rails/issues/9454,但我无法确切地知道解决方案是什么。
基本上,我的问题是:如何配置强参数以允许具有未知密钥的哈希?
感谢您的帮助!
答案 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
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)
您的需求与强参数的目标完全相反, 当我们定义强参数时,基本上我们将把即将到来的参数列入白名单。
在这种情况下,我们确实不知道密钥,所以不需要在那里进行强参数检查。这将解决您的问题。