Подтвердить что ты не робот

Rails 3 Проверка: наличие => false

Вот то, что я ожидал, был совершенно прямым вопросом, но я не могу найти окончательного ответа в руководствах или в других местах.

У меня есть два атрибута на ActiveRecord. Я хочу, чтобы один из них присутствовал, а другой - нуль или пустая строка.

Как сделать эквивалент: presence = > false? Я хочу убедиться, что значение равно нулю.

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

4b9b3361

Ответ 1

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

Чтобы позволить объекту быть действительным тогда и только тогда, когда определенный атрибут равен нулю, вы можете использовать "включение", а не создавать свой собственный метод.

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

Это для Rails 3. Решение Rails 4 намного более элегантно:

validates :name, absence: true

Ответ 3

использовать пользовательскую проверку.

validate :validate_method

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

Ответ 4

Он выглядит так: length = > {: is = > 0} работает для того, что мне нужно.

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

Ответ 5

Try:

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

Надеюсь, что это поможет.