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)

但是需要return一个数组而不是散列。

我怎样才能拥有与 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 异常,否则它将 return permit 可以使用的键数组。

一般来说,您想要对 require 执行的操作通常由模型验证来处理。

关于要求和许可的文档在这里...

http://api.rubyonrails.org/classes/ActionController/Parameters.html

require只是为了确保参数具有正确的通用结构。

例如,如果您有:

params.require(:foo).permit(:bar, :baz)

require 让我们在缺少 :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

但这只是糟糕的应用程序设计,因为您让模型级业务逻辑潜入控制器。