Ответ 1
Все эти макросы validates_whatever_of :attr
- это вызов validates :attr, :whatever => true
.
Проблема в том, что вы используете validate
, а не validates
.
В чем разница между проверками: наличие и 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, это будет.
Все эти макросы validates_whatever_of :attr
- это вызов validates :attr, :whatever => true
.
Проблема в том, что вы используете validate
, а не validates
.
В Rails 3.x и 4.x - теперь предлагается использовать следующий синтаксис:
validates :email, presence: true
validates :password, presence: true
Вместо пути 2.x:
validates_presence_of :email
validates_presence_of :password
Фактически validates и validates_presence_of не совсем равны!
validates_presence_of позволяет вам также лениво проверить пример значения в поле, включенном в другую таблицу.
Вроде:
validates_presence_of :pay_type, :inclusion => PaymentType.names
Что вы не можете сделать так легко с чем-то вроде этого
validates :pay_type, presence, :inclusion => PaymentType.names
Причина включения оценивается только в первый раз (не ленивым способом)
Я бы подумал, что использовать 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