[英]Rails strong parameters, user require and get an hash
我有這種方法
def create_billing_address(data)
address_data = data.permit(:first_name,
:last_name,
:phone,
:address_1,
:city,
:postcode,
:country)
service_customer.create_address(customer_id, address_data)
end
但是現在我要檢查所有鍵是否都存在。 我試圖做到這一點
address_data = data.require(:first_name,
:last_name,
:phone,
:address_1,
:city,
:postcode,
:country)
但是要求返回一個數組而不是哈希。
我如何才能具有permit
但具有require
的相同行為?
permit
和require
不能以您的想法互換。 如果確定所有必需的鍵都存在,則仍需要允許它們在批量分配中使用。
所以您可能需要做...
def create_billing_address(data)
fields = %i(first_name last_name phone address_1 city postcode country)
address_data = data.permit(data.require(fields))
service_customer.create_address(customer_id, address_data)
end
如果缺少鍵,則data.require
將引發ActionController::ParameterMissing
異常,否則將返回一個數組,該數組可以被permit
。
通常,您要處理的require
通常由模型驗證來處理。
有關要求和許可的文件在這里...
http://api.rubyonrails.org/classes/ActionController/Parameters.html
require
僅用於確保參數具有正確的一般結構。
例如,如果您有:
params.require(:foo).permit(:bar, :baz)
require
:foo
如果缺少:foo
鍵,我們可以提前保釋,因為我們無法對請求執行任何操作。
require
並非旨在驗證各個參數的存在-在Rails中使用模型級別的驗證來處理。
如果確實需要,可以執行以下操作:
def create_billing_address!(data)
keys = [:first_name, :last_name, :phone, :address_1, :city, :postcode, :country]
keys.each do |k|
raise ActionController::ParameterMissing and return unless data[k].present?
end
service_customer.create_address(customer_id, data.permit(*keys))
end
但這只是糟糕的應用程序設計,因為您讓模型級業務邏輯潛入控制器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.