ОБНОВЛЕНИЕ (4 декабря 2010 г.):
Я понял, что каждая строка validates
на самом деле является вызовом метода (очевидно), поэтому требовать их таким образом было не совсем так, как я ожидал.
Это работает, но я не уверен, что это правильно (полностью определите имя класса Auction
):
class Auction::Validations
Auction.validates :status, :presence => true,
:inclusion => { :in => [
Auction::CREATING,
Auction::OPEN,
Auction::PENDING,
Auction::CANCELLED,
Auction::SUSPENDED,
Auction::EXPIRED,
Auction::CLOSING_COMPLETED,
Auction::CLOSING_WON,
Auction::COMPLETED,
Auction::WON,
Auction::NEGOTIATING,
Auction::IN_ESCROW
] }
Auction.validates :user, :presence => true
Auction.validates :url, :presence => true,
# FIXME: Move this to a URLValidator and do :url => true
:format => /^https?:\/\/[a-z0-9-]+(\.[a-z0-9-])*\.[a-z0-9]+\/.*/i
Auction.validates :title, :presence => true,
:length => { :maximum => 255 }
Auction.validates :description, :presence => true
Auction.validates :reserve, :numericality => { :greater_than_or_equal_to => :minimum_bid }
end
Когда это требуется (require 'auction/validations
) в классе Auction
, он поступает правильно.
Оригинальный вопрос следует:
Пара моих модельных классов немного загромождена всеми этими вызовами «проверки», поэтому я подумал, что смогу переместить их в отдельный класс и «требовать» этого, но это, похоже, не работает.
class Auction < ActiveRecord::Base
require 'auction/validations'
...
class Auction::Validations
include ActiveModel::Validations
validates :status, :presence => true,
:inclusion => { :in => [
... snip ...
] }
validates :user, :presence => true
validates :url, :presence => true,
# FIXME: Move this to a URLValidator
:format => /^https?:\/\/[a-z0-9-]+(\.[a-z0-9-])*\.[a-z0-9]+\/.*/i
validates :title, :presence => true,
:length => { :maximum => 255 }
validates :description, :presence => true
validates :reserve, :numericality => { :greater_than_or_equal_to => :minimum_bid }
validates_each :status, :on => :update do |auction, status_attr, value|
if auction.state_machine.current_state != value
# FIXME: Raise an Exception instead; this is a developer error, not a user error
auction.errors.add status_attr, "Status cannot be changed directly"
end
end
end
Это не ошибка, но validates_each вообще не выполняет блок (проверено добавлением puts "here"
), и проверка числового значения больше не работает.
Когда тело этого класса слепо скопировано обратно в класс Auction, все снова работает.
Я неправильно понимаю, что «требуется» делать с этими проверками?
РЕДАКТИРОВАТЬ:
На самом деле ни одна проверка не работает. Не только эти двое. Хм.