ОБНОВЛЕНИЕ (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"
), а проверка чисел больше не работает.
Когда тело этого класса снова слепо скопировано обратно в класс Аукциона, все работает.
Неужели я не понимаю, что «требование» будет делать с этими проверками?
EDIT:
На самом деле ни одна из проверок не работает. Не только эти двое. Хммм.