簡體   English   中英

Rails強大的參數,用戶要求並獲取哈希

[英]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的相同行為?

permitrequire不能以您的想法互換。 如果確定所有必需的鍵都存在,則需要允許它們在批量分配中使用。

所以您可能需要做...

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.

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