0

我正在安装一个名为 completeness-fu 的 gem。

这是我得到的错误:

completeness-fu-0.6.0/lib/completeness-fu/active_model_additions.rb:12:in `define_completeness_scoring': please make sure ActiveModel::Naming is included so completeness_scoring can translate messages correctly (CompletenessFu::CompletenessFuError)

这意味着什么?

4

1 回答 1

0

ActiveModel::Naming #model_name在您的对象上创建一个方法。完整性fu gem 似乎需要它的#define_completeness_scoring方法。

自述文件

Completeness-Fu 过去仅适用于 ActiveRecord,但随着最新版本的变化,这已更改为仅需要 ActiveModel 作为 gem 依赖项(以及一点 ActiveSupport)。这意味着最新版本适用于以下 ORM:

  • 活动记录
  • 蒙古族
  • 卡桑德拉对象

默认情况下,它define_completeness_scoring method会混入上述 ORM 中,但如果您想在ActiveModel不是上述 ORM 之一的模型中使用 Completeness-Fu,请确保包含ActiveModel::Naming. 如果要缓存完整性分数,请确保还包括ActiveModel::ValidationsActiveModel::Validations::Callbacks

更新

看评论; 潜在问题似乎是 gem 中的错误(截至 2011 年 6 月 29 日)。这可以使用以下代码进行猴子修补(假设 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

警告!!!

这是一个超级临时(和脆弱)的猴子补丁,我真的不建议在生产能力中实际使用这样的代码。

更好的选择是为此找到一个不同的 gem,与作者合作修复它,分叉项目并自己修复它,然后在您的项目中使用该分叉(更多信息)或简单地在您的应用程序中重建此功能在本地使用宝石作为初始设计。

于 2011-06-28T06:03:02.600 回答