这是我期望的一个非常简单的问题,但我无法在指南或其他地方找到明确的答案。
我在ActiveRecord上有两个属性。我想要一个存在,另一个是零或空字符串。
我如何做相当于:presence =>假?我想确保价值为零。
validates :first_attribute, :presence => true, :if => "second_attribute.blank?"
validates :second_attribute, :presence => true, :if => "first_attribute.blank?"
# The two lines below fail because 'false' is an invalid option
validates :first_attribute, :presence => false, :if => "!second_attribute.blank?"
validates :second_attribute, :presence => false, :if => "!first_attribute.blank?"
或许还有更优雅的方式来做到这一点......
我正在运行Rails 3.0.9
答案 0 :(得分:28)
当且仅当特定属性为nil时,允许对象有效,您可以使用“包含”而不是创建自己的方法。
validates :name, inclusion: { in: [nil] }
这适用于Rails 3. Rails 4解决方案更加优雅:
validates :name, absence: true
答案 1 :(得分:8)
class NoPresenceValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.errors[attribute] << (options[:message] || 'must be blank') unless record.send(attribute).blank?
end
end
validates :first_attribute, :presence => true, :if => "second_attribute.blank?"
validates :second_attribute, :presence => true, :if => "first_attribute.blank?"
validates :first_attribute, :no_presence => true, :if => "!second_attribute.blank?"
validates :second_attribute, :no_presence => true, :if => "!first_attribute.blank?"
答案 2 :(得分:3)
使用自定义验证。
validate :validate_method
# validate if which one required other should be blank
def validate_method
errors.add(:field, :blank) if condition
end
答案 3 :(得分:1)
看起来像:length =&gt; {:is =&gt; 0}适用于我需要的东西。
validates :first_attribute, :length => {:is => 0 }, :unless => "second_attribute.blank?"
答案 4 :(得分:0)
尝试:
validates :first_attribute, :presence => {:if => second_attribute.blank?}
validates :second_attribute, :presence => {:if => (first_attribute.blank? && second_attribute.blank? )}
希望有所帮助。