[英]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_id
和explanation
?
注意:請不要與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.