Rails 3: validates :sence => true против validates_presence_of - PullRequest
27 голосов
/ 25 марта 2011

В чем разница между validates :presence и 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

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

Ответы [ 4 ]

25 голосов
/ 25 марта 2011

Все, что делают макросы validates_whatever_of :attr, это вызывает validates :attr, :whatever => true.

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

22 голосов
/ 08 января 2013

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

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

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

validates_presence_of :email
validates_presence_of :password
0 голосов
/ 15 ноября 2017

Я бы подумал, что целесообразно использовать 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
0 голосов
/ 15 июля 2015

На самом деле validates и validates_presence_of не совсем равны!

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

Примерно так:

validates_presence_of :pay_type, :inclusion => PaymentType.names

Что-то, что вы не можете так легко сделать с чем-то подобным

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

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

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