ruby-on-rails Rails 3验证:presence => false

gab6jxml  于 2024-01-09  发布在  Ruby
关注(0)|答案(5)|浏览(120)

这是我所期望的一个非常简单的问题,但我在指南或其他地方找不到明确的答案。
我在ActiveRecord上有两个属性。我希望一个正好存在,另一个为nil或空字符串。
我如何做等价的:presence => false?我想确保值为nil。

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

f0brbegy

f0brbegy1#

为了允许一个对象当且仅当一个特定的属性为nil时才有效,你可以使用“inclusion”而不是创建自己的方法。

validates :name, inclusion: { in: [nil] }

字符串
这是针对Rails 3的。Rails 4解决方案要优雅得多:

validates :name, absence: true

gt0wga4j

gt0wga4j2#

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?"

字符串

db2dz4w8

db2dz4w83#

使用自定义验证。

validate :validate_method

# validate if which one required other should be blank
def validate_method
  errors.add(:field, :blank) if condition
end

字符串

umuewwlo

umuewwlo4#

看起来:length => {:is => 0 }适合我的需要。

validates :first_attribute, :length => {:is => 0 }, :unless => "second_attribute.blank?"

字符串

wz1wpwve

wz1wpwve5#

试试看:

validates :first_attribute, :presence => {:if => second_attribute.blank?}
validates :second_attribute, :presence => {:if => (first_attribute.blank? && second_attribute.blank? )}

字符串
希望对你有帮助。

相关问题