Как установить экземпляр модели как недействительный после запуска проверок, но до их сохранения? - PullRequest
2 голосов
/ 09 ноября 2009

У меня есть стандартная модель активной записи с необходимыми атрибутами:

class Sample < ActiveRecord::Base
  has_many :colors

  before_validation :grab_colors

  validates_presence_of :size
  validate :number_of_colors

  private

  def grab_colors
    # grab x number of colors | x = size
  end

  def number_of_colors
    self.errors.add("size","is to large.") if colors.count < size
  end
end

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

Могу ли я установить экземпляр как недействительный и остановить процесс сохранения после того, как вся проверка была выполнена?

Ответы [ 2 ]

1 голос
/ 09 ноября 2009

Есть несколько способов сделать это, но все они включают переписывание grab_colors для выполнения проверки validates_presence_of.

Вы настраиваете обратный вызов before_validation. Любой обратный вызов, который возвращает false, отменяет оставшуюся часть транзакции. Поэтому вам нужно разобраться с этим случаем, который заставляет grab_colors работать самостоятельно. По сути, вы просите что-то вроде этого:

def grab_colors
  unless size.blank?
    # grab x number of colors | x = size
  else
    errors.add(:size, "cannot be empty.")
    return false
  end
end

Это объединяет ваш пользовательский before_validation с validates_presence_of. Если размер не существует, grab_colors установит ошибку и вернет false, отменяя оставшуюся часть транзакции, поэтому ваши стандартные проверки никогда не будут выполнены. Из того, что вы упомянули, единственный раз, когда это терпит неудачу, это когда размер не установлен.

Вы также можете достичь желаемого эффекта, если бы number_of_colors вызывал grab_colors вместо вызова grab_colors в качестве before_validation. Тем не менее, вам все равно придется настроить grab_colors для обработки ошибки, когда размер не определен.

0 голосов
/ 10 ноября 2009

Я предполагаю, что вы хотите, чтобы метод number_of_colors работал после метода grab_colors. В этом случае я бы рекомендовал вызывать оба метода по порядку из validate метода.

def validate
  unless size.blank?
    grab_colors 
    number_of_colors
  end
end

Проверка размера все еще обрабатывается

validates_presence_of :size

Но если у вас есть размер, то grab_colors и number_of_colors запускаются. Теперь вам не понадобятся эти строки

before_validation :grab_colors
validate :number_of_colors
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...