ActiveModel::Naming
создает метод #model_name
для вашего объекта . Похоже, что драгоценность завершенности фу требует его для метода #define_completeness_scoring
.
Из readme :
Completeness-Fu имел обыкновение быть только для ActiveRecord, но это изменилось с последней версией с только ActiveModel, необходимым как зависимость драгоценного камня (и немного ActiveSupport). Это означает, что последняя версия работает со следующими ORM:
- ActiveRecord
- Mongoid
- Кассандра Объект
По умолчанию define_completeness_scoring method
смешивается с вышеупомянутыми ORM, но если вы хотите использовать Completeness-Fu в модели ActiveModel
, которая не является одной из вышеуказанных ORM, убедитесь, что вы включили ActiveModel::Naming
. Если вы хотите кэшировать показатель полноты, убедитесь, что вы также включили ActiveModel::Validations
и ActiveModel::Validations::Callbacks
.
Обновлено
см. Комментарии; основная проблема, кажется, ошибка в драгоценном камне (по состоянию на 29 июня 2011 года). Это может быть исправлено обезьяной с помощью следующего кода (при условии, что Ruby 1.9). Единственное изменение - использование self.singleton_class.include?(ActiveModel::Naming)
для получения правильного ответа.
# lib/completeness-fu.rb
module CompletenessFu
module ActiveModelAdditions
def self.included(base)
base.class_eval do
def self.define_completeness_scoring(&checks_block)
# The check below is causing the problem; the simplest fix in Ruby 1.8
# would be to simply remove it by commenting out the following 3 lines.
unless self.singleton_class.include?(ActiveModel::Naming)
raise CompletenessFuError, 'please make sure ActiveModel::Naming is included so completeness_scoring can translate messages correctly'
end
class_inheritable_array :completeness_checks
cattr_accessor :default_weighting
cattr_accessor :model_weightings
self.send :extend, ClassMethods
self.send :include, InstanceMethods
checks_results = CompletenessFu::ScoringBuilder.generate(self, &checks_block)
self.default_weighting = checks_results[:default_weighting]
self.completeness_checks = checks_results[:completeness_checks]
self.model_weightings = checks_results[:model_weightings]
if checks_results[:cache_score_details]
unless self.include?(ActiveModel::Validations::Callbacks)
raise CompletenessFuError, 'please make sure ActiveModel::Validations::Callbacks is included before define_completeness_scoring if you want to cache competeness scoring'
end
self.before_validation checks_results[:cache_score_details]
end
end
end
end
end
end
Внимание !!!
Это супер-временный (и хрупкий) патч обезьяны, и я действительно не рекомендую на самом деле использовать подобный код в производственном режиме.
Лучшим вариантом было бы найти для этого другой драгоценный камень, поработать с автором, чтобы исправить его, раскошелиться на проект и исправить его самостоятельно, затем использовать этот форк в своем проекте ( больше информации ) или просто восстановите эту функциональность в своем приложении локально, используя гем в качестве начального дизайна.