我有一个 Rails 应用程序,它将序列化的哈希存储在一个名为properties
.
不过,哈希键是未知的,所以我不知道有一种方法可以使用强参数来实现这一点。
谷歌搜索时,我发现了这个:https ://github.com/rails/rails/issues/9454 ,但我无法弄清楚解决方案到底是什么。
所以基本上,我的问题是:如何配置强参数以允许具有未知键的哈希?
感谢大家的帮助!
我有一个 Rails 应用程序,它将序列化的哈希存储在一个名为properties
.
不过,哈希键是未知的,所以我不知道有一种方法可以使用强参数来实现这一点。
谷歌搜索时,我发现了这个:https ://github.com/rails/rails/issues/9454 ,但我无法弄清楚解决方案到底是什么。
所以基本上,我的问题是:如何配置强参数以允许具有未知键的哈希?
感谢大家的帮助!
我最近遇到了同样的问题,我使用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
而不是:log
for ,请记住在调用之前删除from 。然后方法将是config.action_controller.action_on_unpermitted_parameters
environment
properties
params
permit
def product_params
properties = params[:product].delete(:properties)
params.require(:product).permit(:title, :description).tap do |whitelisted|
whitelisted[:properties] = properties
end
end
这些答案都不适合我(使用 Rails 4.2.4),所以我想出了以下解决方法:
def product_params
properties_keys = params[:product][:properties].keys
params.require(:product).permit(:title, :description, properties: properties_keys)
end
希望对某人有所帮助。
您可以使用散列代替符号并定义允许的子属性。这可以在源代码中看到:
case filter
when Symbol, String
permitted_scalar_filter(params, filter)
when Hash
hash_filter(params, filter)
end
例如
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
您的需求与强参数的目标完全相反,当我们定义强参数时,基本上我们会将即将到来的参数列入白名单。
在您的情况下,我们完全不知道密钥,因此无需在那里进行强大的参数检查。这将解决你的问题。