2

我有一个依赖于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). 我很困惑。任何关于为什么会发生这种情况的指针都值得赞赏。如果您需要更多代码,请在评论中说明。

4

1 回答 1

3

代码看起来不错。validate我从 Rails 知道有两种不同的方法,一种用于验证记录(实例方法),另一种(类方法)用于更一般的情况,因为它确实适用于您的场景。

向类添加验证方法或块。当覆盖 validate 实例方法变得过于笨拙并且您正在寻找更具描述性的验证声明时,这很有用。

文档显示您需要包含该模块ActiveModel::Validations。是的,Couchbase 确实将其包含在其自己的ActiveModel模块中,但前提是它可用。我的猜测是问题源于Couchbase 源代码的这一行

return unless defined?(::ActiveModel)

通过::它访问外部模块名称范围以获取 Rails 模块。如果此模块可用,它将继续并包含更多 Rails Active Model 模块。

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
于 2013-08-21T21:08:08.113 回答