Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails强参数,用户需要并获取哈希_Ruby On Rails_Strong Parameters - Fatal编程技术网

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
但这只是糟糕的应用程序设计,因为您让模型级业务逻辑潜入控制器