如何使用模块在Rails中扩展类?

时间:2011-12-14 12:06:26

标签: ruby-on-rails

我已经将以下内容粘贴到我的用户模型中:

module ClassMethods
  Devise::Models.config(self, :email_regexp, :password_length)
end

我想在我的用户模型中执行类似self.extend ClassMethods之类的操作,但我似乎无法正确使用它。我想在我的用户模型中直接访问设计中的这些方法。

4 个答案:

答案 0 :(得分:0)

您是否尝试过:

require 'my_module'
include MyModule::ClassMethods

答案 1 :(得分:0)

您需要使用ActiveSupport::Concern。在应该用于扩展您插入的类的模块中:

module ModuleName
     extend ActiveSupport::Concern
     ....
     ....
     ....
     module ClassMethods
           # the Class Methos you want to add to other Classes here
     end

     module InstanceMethods
           # the instance Methods you want to add to other classes here
     end
end

然后,你需要做的只是include你希望扩展的Model

class User < ActiveRecord::Base
     include ModuleName
end

多数民众赞成。有关更多信息,请查看apidock =&gt; ::的ActiveSupport关注!

答案 2 :(得分:0)

我不确定我是否把一切都搞定了但如果你想在包含模块时为课程添加功能,你可以使用self.included

module ClassMethods

  def self.included( base )
    Devise::Models.config( base, :email_regexp, :password_length )
  end

end

答案 3 :(得分:0)

我能想到的最佳方式是:

module Devisable
  def included(base)
    base.class_eval do
      Devise::Models.config(self, :email_regexp, :password_length)
    end
  end
end

class_eval是一种插入代码的好方法,可以防止您使用baseClassMethods