簡體   English   中英

強參數允許嵌套屬性的所有屬性

[英]strong parameters permit all attributes for nested attributes

有沒有辦法在強參數中允許nested_attributes 模型的所有屬性? 這是一個示例代碼。

class Lever < ActiveRecord::Base
 has_one :lever_benefit
 accepts_nested_attributes_for :lever_benefit
end

class LeverBenefit < ActiveRecord::Base
  # == Schema Information
  #  id          :integer          not null, primary key
  #  lever_id    :integer
  #  explanation :text
end

對於杠桿強參數,我目前正在寫這個

def lever
 params.require(:lever).permit(:name,:lever_benefit_attributes => [:lever_id, :explanation])
end

有沒有辦法讓我可以編寫嵌套屬性來允許所有屬性,而無需明確給出屬性名稱,如lever_idexplanation

注意:請不要與permit!混淆這個問題permit! permit(:all)這用於允許所有嵌套屬性

我遇到的唯一允許嵌套參數哈希中的任意鍵對我來說似乎合理的情況是寫入序列化列時。 我設法像這樣處理它:

class Post
  serialize :options, JSON
end

class PostsController < ApplicationController
  ...

  def post_params
    all_options = params.require(:post)[:options].try(:permit!)
    params.require(:post).permit(:title).merge(:options => all_options)
  end
end

try確保我們不需要:options鍵的禮物。

實際上有一種方法可以將所有嵌套參數列入白名單。

params.require(:lever).permit(:name).tap do |whitelisted|
  whitelisted[:lever_benefit_attributes ] = params[:lever][:lever_benefit_attributes ]
end

這種方法優於其他解決方案。 它允許允許深度嵌套的參數。

而其他解決方案如:

nested_keys = params.require(:lever).fetch(:lever_benefit_attributes, {}).keys
params.require(:lever).permit(:name,:lever_benefit_attributes => nested_keys)

別。


來源:

https://github.com/rails/rails/issues/9454#issuecomment-14167664

首先,確保您確實希望允許嵌套散列中的所有值。 通讀Damien MATHIEU 的回答,了解潛在的安全漏洞...

如果您仍然需要/想要允許散列中的所有值(有完全有效的用例,例如存儲非結構化的、用戶提供的記錄元數據),您可以使用以下代碼位實現它:

def lever_params
  nested_keys = params.require(:lever).fetch(:lever_benefit_attributes, {}).keys
  params.require(:lever).permit(:name,:lever_benefit_attributes => nested_keys)
end

注意:這與tf. 的答案非常相似,但更優雅一些,因為您不會得到任何Unpermitted parameters: lever_benefit_attributes警告/錯誤。

我很驚訝沒有人提出這個建議:

params.require(:lever).permit(:name,:lever_benefit_attributes => {})

嘗試

params.require(:lever).permit(:name, leave_benefit_attributes: LeaveBenefit.attribute_names.collect { |att| att.to_sym })

強參數的全部意義在於其名稱:使您的輸入參數強。
允許所有參數將是一個非常糟糕的主意,因為它會允許任何人插入您不一定希望由您的用戶更新的值。

在您提供的示例中,您提到了當前需要提供的兩個參數:
[:lever_id, :explanation]

如果您允許所有參數,則有人可以更改任何其他值。
created_at ,或例如lever_id

這肯定是一個安全問題,這就是為什么你不應該這樣做。
當你這樣做時,明確指定你的所有屬性可能看起來很無聊。
但這對於確保您的應用程序安全是必要的。

編輯:對於那些反對這一點的人。 這可能不是您正在尋找的答案,但卻是您需要的答案。
將所有嵌套屬性列入白名單是一個巨大的安全漏洞,強參數試圖保護您,您正在刪除它。
看看是什么導致構建 strong_params,以及不使用它對你有什么危害: https ://gist.github.com/peternixey/1978249

暫無
暫無

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

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