簡體   English   中英

Rails哈希具有未知鍵和強參數

[英]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

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

你的需求與強參數目標完全相反,當我們定義強參數時,基本上我們將把即將到來的參數列入白名單。

在這種情況下,我們完全不知道密鑰,所以沒有必要在那里進行強參數檢查。 這將解決你的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM