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
)
如果您提供更多关于如何管理购买流的上下文,我将能够为它提供更好的条件逻辑