我的应用程序取决于Couchbase::Model
。我创建了一个类来封装所有令人讨厌的数据库hackage,我需要以自定义方式验证某些属性。所以我写了一个自定义验证方法:
class AdServeModel < Couchbase::Model
validate :validate_attributes
[...] (some other stuff happens here)
def validate_attributes
#First we validate the objects we belong_to
unless belongsToModels.nil?
belongsToModels.each do |attribute|
retrievedClass = attribute.to_s.camelize.constantize.find(
send("#{belongsToAttributeName(attrName)}"))
errors.add(attribute.to_sym, "#{attribute} is invalid") unless !retrievedClass.nil? and retrievedClass.valid?
end
end
end
但是当我尝试运行时,我得到:
undefined method 'validate' for AdServeModel(id):Class (NoMethodError)
。
我很难过。关于为什么会发生这种情况的任何指示都值得赞赏。如果您需要更多代码,请在评论中说明。
答案 0 :(得分:3)
代码看起来很好。我从Rails中知道了两种名为validate
的不同方法,一种用于validating records(实例方法),another one(类方法)用于更一般的情况,因为它适用在你的场景中。
向类添加验证方法或块。当覆盖验证实例方法变得过于笨拙并且您正在寻找更具描述性的验证声明时,这非常有用。
documentation表示您需要包含ActiveModel::Validations
模块。是的,Couchbase确实包含已经存在于其ActiveModel
模块中的模块,但仅限于它可用。我的猜测是问题源自Couchbase源代码的this line。
return unless defined?(::ActiveModel)
使用::
,它访问外部模块名称范围以获取Rails模块。如果此模块可用,它将继续并包含更多Rails活动模型模块。
base.class_eval do
extend ActiveModel::Callbacks
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
可能Couchbase无法访问Rails模块。最好检查Couchbase是否真的包含模块,分别让Couchbase找到Rails模块。替代/解决方法可能是自己简单地包含模块。
class AdServeModel < Couchbase::Model
include ActiveModel::Validations
# ...
end