Ruby on rails Rails控制台包含不同于型号的

Ruby on rails Rails控制台包含不同于型号的,ruby-on-rails,include,Ruby On Rails,Include,tl;dr:include MyModule在rails控制台中运行时,将MyModule的功能纳入范围,但在rails模型中运行时则不纳入范围。我不理解,希望能够在我的模型中访问这些函数 我有这个文件lib/zip\u validator.rb,我想用它来验证我的用户模型的用户输入 module ActiveModel::Validations::HelperMethods def validates_zip(*attr_names) validates_with ZipValid

tl;dr:
include MyModule
在rails控制台中运行时,将
MyModule
的功能纳入范围,但在rails模型中运行时则不纳入范围。我不理解,希望能够在我的模型中访问这些函数

我有这个文件
lib/zip\u validator.rb
,我想用它来验证我的
用户
模型的用户输入

module ActiveModel::Validations::HelperMethods
  def validates_zip(*attr_names)
    validates_with ZipValidator, _merge_attributes( attr_names )
  end
end

class ZipValidator < ActiveModel::EachValidator
  def validate_each( record, attr_name, value )
    unless is_legitimate_zipcode( self.zip )
      record.errors.add( attr_name, :zip, options.merge( value: value ))
    end
  end
end
当我尝试启动服务器(精简)时,会出现以下错误:

/usr/lib64/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/dynamic_matchers.rb:55:in `method_missing': undefined method `validates_zip' for #<Class:0x00000003e03f28> (NoMethodError)
    from /home/bistenes/Programming/myapp/app/models/user.rb:38:in `<class:User>'
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_-record/dynamic_-matchers.rb:55:in'method_-missing':未定义的方法'validates_-zip'for#(命名错误)
from/home/bistenes/Programming/myapp/app/models/user.rb:38:in`'
到底发生了什么事?为什么服务器找不到控制台找到的函数?

请考虑以下问题:

module M
  def m
  end
end

class C
  include M
end
有鉴于此,你可以毫无怨言地说
C.new.m
,但你不能
C.m
。这是怎么回事?当您说
include M
时,
M
中的方法将作为实例方法添加到
C
,但如果您想说:

class C
  include M
  m
end
然后,
m
必须是一个类方法,因为调用
m
时,
self
就是类本身。您可以使用模块中包含的
钩子执行此操作:

module M
  def self.included(base)
    base.class_exec do
      def m
      end
    end
  end
end
class C
  include M
  m # This works now
end
在你的情况下,你会有这样的东西:

module ActiveModel::Validations::HelperMethods
  def self.included(base)
    base.class_exec do
      def self.validates_zip(*attr_names)
        validates_with ZipValidator, _merge_attributes( attr_names )
      end
    end
  end
end
现在,您的
用户
将拥有一个
validates\u zip
类方法,您可以在所需的上下文中调用该方法

module M
  def self.included(base)
    base.class_exec do
      def m
      end
    end
  end
end
class C
  include M
  m # This works now
end
module ActiveModel::Validations::HelperMethods
  def self.included(base)
    base.class_exec do
      def self.validates_zip(*attr_names)
        validates_with ZipValidator, _merge_attributes( attr_names )
      end
    end
  end
end