重新打开lib目录中gem中定义的模块

时间:2011-11-16 02:26:37

标签: ruby-on-rails

我有一个看起来像这样的文件

module Devise
  module Mailers
    module Helpers

      def initialize_from_record(record)
        record = hack_record(record)
        @scope_name = Devise::Mapping.find_scope!(record)
        @resource = instance_variable_set("@#{devise_mapping.name}", record)
      end

      protected

      # monkey patch :D
      def hack_record(record)
        record.kind_of?(Hash) ? kmodel(record).where(:email=>record.first[1]['email']).first : record
      end

      def kmodel(record)
        record.first[0].camelize.constantize
      end

    end
  end
end

它显然重新打开了一个Devise模块。如果我把它放在初始化器中,一切都很棒。但是,如果我把它放在lib / devise / mailers中,它会被读取但是它找不到Devise gem中定义的模块中的其他方法。那是为什么?

1 个答案:

答案 0 :(得分:0)

这是因为它在Devise之前加载了你的 Devise模块。它们的名称相同,并且位于相同的位置(至少根据负载路径)。

如果你想在这个模块上定义新方法,那么如何完全定义一个不同的模块并将其包含在Devise中呢?

<强> LIB /色器件/邮寄者/ helpers_extensions.rb

module Devise
  module Mailers
    module HelpersExtensions
      # your code
    end
  end
end

Devise::Mailers::Helpers.send :include, Devise::Mailers::HelpersExtensions