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

Rails 3: проверяет: наличие => true vs validates_presence_of

В чем разница между проверками: наличие и validates_presence_of? Просматривая ActiveModel, похоже, что они настраивают валидацию одинаково. Однако, учитывая следующее определение модели:

class Account < ActiveRecord::Base
  has_one :owner_permission, :class_name => 'AccountPermission', :conditions => { :owner => true, :admin => true }
  has_one :owner, :class_name => 'User', :through => :owner_permission, :source => :user

  validate :owner, :presence => true
  validates_associated :owner
end

Вызов сохранения экземпляра учетной записи не подтверждает наличие владельца. Хотя, если я использую validates_presence_of, это будет.

4b9b3361

Ответ 1

Все эти макросы validates_whatever_of :attr - это вызов validates :attr, :whatever => true.

Проблема в том, что вы используете validate, а не validates.

Ответ 2

В Rails 3.x и 4.x - теперь предлагается использовать следующий синтаксис:

validates :email, presence: true
validates :password, presence: true

Вместо пути 2.x:

validates_presence_of :email
validates_presence_of :password

Ответ 3

Фактически validates и validates_presence_of не совсем равны!

validates_presence_of позволяет вам также лениво проверить пример значения в поле, включенном в другую таблицу.

Вроде:

validates_presence_of :pay_type, :inclusion => PaymentType.names

Что вы не можете сделать так легко с чем-то вроде этого

validates :pay_type, presence, :inclusion => PaymentType.names

Причина включения оценивается только в первый раз (не ленивым способом)

Ответ 4

Я бы подумал, что использовать validates :foo presence: true целесообразно, если вы хотите включить другие проверки :foo, такие как длина или уникальность. Но если вы знаете, что единственная проверка, которая вам понадобится для атрибута, это наличие, тогда validates_presence_of оказывается более эффективным.

Итак:

validates :foo, length: {maximum: 50}, uniqueness: true, 
                format: {with: /bar/}, 
                presence: true # lots of validations needed

Но:

validates_presence_of :foo # only presence validation needed