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
的行为?
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
异常,否则它将 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
但这只是糟糕的应用程序设计,因为您让模型级业务逻辑潜入控制器。
我有这个方法
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
的行为?
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
异常,否则它将 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
但这只是糟糕的应用程序设计,因为您让模型级业务逻辑潜入控制器。