Ruby - почему эта функция обратного вызова не работает - PullRequest
1 голос
/ 28 июня 2011

У меня есть это утверждение на моей модели:

class Question

    validates :closed, :inclusion => { :in => [false, true] }

    before_validation :ensure_default_data


    def ensure_default_data

        self.closed = false if self.closed.nil?

    end
end

Когда я звоню:

Question.create

Это выводит меня:

#<Question id:nil, closed: false>

Если я изменю функцию следующим образом:

def ensure_default_data
    self.closed = 0 if self.closed.nil?
end

Работает!

Кто-то имеет представление об этом, и почему первая функция не работает?

Я использую PostgreSQL, и мое поле имеет логическое значение.

1 Ответ

6 голосов
/ 28 июня 2011

Ваш обратный вызов препятствует сохранению модели. От http://apidock.com/rails/ActiveRecord/Callbacks:

Если возвращаемое значение обратный вызов before_validation может быть оценивается как ложный, процесс будет будет прервана и Base # save вернется ложный. Если Base # сохранить! называется это будет поднять ActiveRecord :: RecordInvalid исключение. Ничто не будет добавлено к объект ошибки.

Когда self.closed не равно nil, ваш обратный вызов возвращает значение self.closed.nil? (то есть false), что предотвращает сохранение. Чтобы предотвратить это, убедитесь, что вы вернули true:

def ensure_default_data
  self.closed = false if self.closed.nil?
  true
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...