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 

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