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::Validations
和ActiveModel::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,与作者合作修复它,分叉项目并自己修复它,然后在您的项目中使用该分叉(更多信息)或简单地在您的应用程序中重建此功能在本地使用宝石作为初始设计。