Что такое замена Rails 3 для ActiveRecord:: Errors?

Что такое замена Rails 3 для ActiveRecord:: Errors?

В Rails 2.3.8 это объект:

>> ActiveRecord::Errors
=> ActiveRecord::Errors

В Rails 3.0.0rc вы получаете NameError:

>> ActiveRecord::Errors
NameError: uninitialized constant ActiveRecord::Errors
 from (irb):2

Я пытаюсь сделать генератор wizardly с Rails 3.

$ rails g wizardly_scaffold home

Но он терпит неудачу:

/Library/Ruby/Gems/1.8/gems/wizardly_gt-0.1.8.9/lib/validation_group.rb:150:
uninitialized constant ActiveRecord::Errors (NameError)

Линия, на которую она ссылается, такова:

ActiveRecord::Errors.send :include, ValidationGroup::ActiveRecord::Errors

Ранее в файле мы видим:

module ValidationGroup
  module ActiveRecord
...
    module Errors # included in ActiveRecord::Errors
      def add_with_validation_group(attribute, msg = I18n.translate('activerecord.errors.messages')[:invalid], *args, &block)
        add_error = @base.respond_to?(:should_validate?) ? (@base.should_validate?(attribute.to_sym) || attribute == :base) : true
        add_without_validation_group(attribute, msg, *args, &block) if add_error
      end
...
end

Ответ 1

Это будет ActiveModel::Errors. Вещи, такие как проверки и обработка ошибок, были перенесены на Active Model, чтобы предоставить общий API для всех ORM Railties, таких как Active Record, Data Mapper, Mongoid и т.д., Чтобы подключаться к Rails с помощью.

Похоже, что волшебный плагин должен сначала проверить ActiveModel, и если он существует, тогда включите обработку ошибок, а не ActiveRecord::Errors. Тривиальное изменение.

Ответ 2

Попробуйте этот камень

http://rubygems.org/gems/wizardly_gt

Я только начинаю играть с волшебным, но выше, по крайней мере, похоже, совместим с Rails 3.

Ответ 3

Wizardly явно делает намного больше, но вы должны проверить validation_scopes, который я только что обновил для совместимости с Rails3. Вместо того, чтобы группировать объекты по атрибутам, он просто позволяет явно объявлять разные группы валидаций, создавая коллекции ошибок с именами. Внутренне это гораздо более простая реализация (тот же код обрабатывает Rails 2 и 3). Лично я считаю, что это более гибко, чем группировка по атрибуту (что, если атрибут должен иметь разные ограничения на разных этапах мастера, например?).