Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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 对某些Activerecord对象属性部分调用验证过程_Ruby On Rails_Validation_Ruby On Rails 4_Activerecord_Rails Activerecord - Fatal编程技术网

Ruby on rails 对某些Activerecord对象属性部分调用验证过程

Ruby on rails 对某些Activerecord对象属性部分调用验证过程,ruby-on-rails,validation,ruby-on-rails-4,activerecord,rails-activerecord,Ruby On Rails,Validation,Ruby On Rails 4,Activerecord,Rails Activerecord,我遇到了这样一种情况,用户拥有一个:地址并且地址属于:用户。 在以下情况下,我需要能够验证address对象: 用户注册后可以选择部分填写地址表。在这种状态下,我想进行验证,例如验证:电话号码,:邮政编码,数字性:true,但用户可以在需要时将字段留空 当用户进行购买时他必须填写地址表。所有字段都必须通过前面的验证进行验证 我知道一种方法是将另一个参数附加到表单(即完全验证),然后添加一个自定义验证方法,该方法将检查此参数,然后完全验证所有属性 我只是想知道是否有一种更高效、更简单的方法来实现这

我遇到了这样一种情况,
用户拥有一个:地址
并且
地址属于:用户
。 在以下情况下,我需要能够验证address对象:

用户注册后可以选择部分填写地址表。在这种状态下,我想进行验证,例如
验证:电话号码,:邮政编码,数字性:true
,但用户可以在需要时将字段留空

当用户进行购买时他必须填写地址表。所有字段都必须通过前面的验证进行验证

我知道一种方法是将另一个参数附加到表单(即
完全验证
),然后添加一个自定义验证方法,该方法将检查此参数,然后完全验证所有属性

我只是想知道是否有一种更高效、更简单的方法来实现这一点

到目前为止,我只找到了验证某些属性的方法(请参阅),但还没有找到关于如何为某些属性调用部分验证过程的建议


任何帮助/建议都将不胜感激:)

对于您的第一个用例,您可以使用
validates
上的
:allow_blank
选项来允许字段为空,即仅在字段不为空时才对其进行验证

对于这两种用例,您可以使用
:if
/
:除非
选项准确地告诉Rails何时启动验证。这称为条件验证:

对于
地址
,您可以尝试以下操作:

class Address
  belongs_to :user
  validates :phone_number, :postal_code, numericality: true, allow_blank: true, if: new_user?

  def new_user?
    user && user.new_record?
  end      
end
这为您的第一个用例提供了一个示例。至于第二个问题,您需要在
User
上使用条件验证,以确保该用户在购买时存在地址。如何处理取决于您的情况:您可以在
用户
上设置一个标志,或者让该标志检查
用户
的某些方面,例如,是否存在针对给定用户的任何购买

class User
  has_one :address
  has_many :purchases
  validates :address, presence: true, if: has_purchases?

  def has_purchases?
    purchases.exists?
  end
end

对于您的第一个用例,您可以使用
validates
上的
:allow_blank
选项允许字段为空,即仅在字段不为空时验证字段

对于这两种用例,您可以使用
:if
/
:除非
选项准确地告诉Rails何时启动验证。这称为条件验证:

对于
地址
,您可以尝试以下操作:

class Address
  belongs_to :user
  validates :phone_number, :postal_code, numericality: true, allow_blank: true, if: new_user?

  def new_user?
    user && user.new_record?
  end      
end
这为您的第一个用例提供了一个示例。至于第二个问题,您需要在
User
上使用条件验证,以确保该用户在购买时存在地址。如何处理取决于您的情况:您可以在
用户
上设置一个标志,或者让该标志检查
用户
的某些方面,例如,是否存在针对给定用户的任何购买

class User
  has_one :address
  has_many :purchases
  validates :address, presence: true, if: has_purchases?

  def has_purchases?
    purchases.exists?
  end
end
#app/models/user.rb
类用户
--

用户注册后

用于确定是否存在
电话号码
邮政编码

只有在提交的数据中存在数字时,才会验证其数字性。
用户是否是新用户并不重要

--

当用户进行购买时

要进行购买,我假定必须创建一个
用户
(否则他无法购买)。我使用该方法来确定用户是否是新记录


最终,我的&
@odata
的回答都暗指使用来确定某些属性/凭证是否值得验证

报告深入讨论了这一问题;我包括了
inverse\u,因为它允许您访问关联对象(允许您在
地址中调用
user.x

如果您提供更多关于如何管理
购买流的上下文,我将能够为它提供更好的条件逻辑

#app/models/user.rb
类用户
--

用户注册后

用于确定是否存在
电话号码
邮政编码

只有在提交的数据中存在数字时,才会验证其数字性。
用户是否是新用户并不重要

--

当用户进行购买时

要进行购买,我假定必须创建一个
用户
(否则他无法购买)。我使用该方法来确定用户是否是新记录


最终,我的&
@odata
的回答都暗指使用来确定某些属性/凭证是否值得验证

报告深入讨论了这一问题;我包括了
inverse\u,因为它允许您访问关联对象(允许您在
地址中调用
user.x

如果您提供更多关于如何管理
购买流的上下文,我将能够为它提供更好的条件逻辑