[英]Rails hashes with unknown keys and strong parameters
我有一個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
你的需求與強參數的目標完全相反,當我們定義強參數時,基本上我們將把即將到來的參數列入白名單。
在這種情況下,我們完全不知道密鑰,所以沒有必要在那里進行強參數檢查。 這將解決你的問題 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.