validate_presence_of срабатывает до или после вызова before_save? - PullRequest
1 голос
/ 17 февраля 2011

Вызывается ли val_presence_of перед событием before_save?

как установить значение по умолчанию для свойства модели?

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Использование before_validation обратных вызовов:

class User
  before_validation(:on => :create) do
    self.time_zone ||= "Blah"
  end
end
0 голосов
/ 17 февраля 2011

Да, все ваши проверки выполняются до обратного вызова before_save. Полный список в порядке см. http://guides.rubyonrails.org/active_record_validations_callbacks.html#available-callbacks.

Я бы порекомендовал использовать after_initialize. Это действительно то, для чего он предназначен. Это означает, что он вызывается для объектов, когда они загружаются из базы данных, а также при их первом создании. Другими словами, их атрибуты соответствуют вашим ожиданиям.

class User
  def after_initialization
    self.foobar ||= 'default value'
  end
end

Из документов :

Обратный вызов after_initialize будет вызывается всякий раз, когда активная запись объект создается, либо непосредственно с использованием нового или когда запись загружен из базы данных. Может быть полезно избегать необходимости напрямую переопределить вашу активную запись инициализации способ.

Будет вызван обратный вызов after_find всякий раз, когда Active Record загружает запись из базы данных. after_find is вызывается до after_initialize, если оба определены.

After_initialize и after_find обратные вызовы немного отличаются от другие. У них нет до этого * коллеги, и единственный способ зарегистрировать их, определив их как обычные методы. Если вы попытаетесь зарегистрироваться after_initialize или after_find с использованием класса в стиле макроса методы, они будут просто игнорироваться. Такое поведение связано с производительностью причины, так как after_initialize и after_find будет вызван для обоих каждая запись найдена в базе данных, значительно замедляя запросы.

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