未定义的方法'验证'为AdServeModel< Couchbase ::型号

时间:2013-08-15 10:10:16

标签: ruby-on-rails couchbase

我的应用程序取决于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)。 我很难过。关于为什么会发生这种情况的任何指示都值得赞赏。如果您需要更多代码,请在评论中说明。

1 个答案:

答案 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