Rails哈希值具有未知键和强参数
我有一个rails应用程序,它在一个名为properties
的字段中存储一个序列化哈希。
虽然哈希键是未知的,但我不知道如何通过强参数来允许它。
谷歌搜索时,我发现了这个: https : //github.com/rails/rails/issues/9454 ,但我无法确切地知道解决方案是什么。
所以基本上,我的问题是:如何配置强参数以允许具有未知密钥的哈希?
谢谢大家的帮助!
你的需求与强参数的目标完全相反,当我们定义强参数时,基本上我们将把即将到来的参数列入白名单。
在这种情况下,我们完全不知道密钥,所以不需要在那里进行强参数检查。 这将解决您的问题 。
我最近有同样的问题,我使用@ fxn的方法从https://github.com/rails/rails/issues/9454解决了它
对于具有哈希properties
产品,将其解析为
def product_params params.require(:product).permit(:title, :description).tap do |whitelisted| whitelisted[:properties] = params[:product][:properties] end end
如果你在你的environment
使用:raise
而不是:log
for config.action_controller.action_on_unpermitted_parameters
,那么记得在调用permit
之前从params
删除properties
。 那么方法就是
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