Ruby on rails Rails强参数,用户需要并获取哈希
我有这个方法Ruby on rails Rails强参数,用户需要并获取哈希,ruby-on-rails,strong-parameters,Ruby On Rails,Strong Parameters,我有这个方法 def create_billing_address(data) address_data = data.permit(:first_name, :last_name, :phone, :address_1, :city,
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)
但需要返回数组而不是散列
我如何才能拥有与许可证相同的行为,但却有要求?许可证和要求不能像您认为的那样互换。如果确定所有必需的关键点都存在,则仍然需要允许它们在批量指定中使用
所以你可能需要做
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执行的操作通常由模型验证来处理
要求和许可证的文件在这里
许可证和要求不能像你想的那样互换。如果确定所有必需的关键点都存在,则仍然需要允许它们在批量指定中使用
所以你可能需要做
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执行的操作通常由模型验证来处理
要求和许可证的文件在这里
require仅用于确保参数具有正确的总体结构
例如,如果您有:
params.require(:foo).permit(:bar, :baz)
如果:foo键丢失,require允许我们提前退出,因为我们无法对请求执行任何操作
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
但这只是糟糕的应用程序设计,因为您让模型级业务逻辑潜入控制器。require只是为了确保参数具有正确的总体结构
例如,如果您有:
params.require(:foo).permit(:bar, :baz)
如果:foo键丢失,require允许我们提前退出,因为我们无法对请求执行任何操作
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
但这只是糟糕的应用程序设计,因为您让模型级业务逻辑潜入控制器