使用extend ActiveSupport :: Concern

时间:2013-02-17 01:29:41

标签: ruby activesupport

我正在使用CodeSchool的RubyBits并且我参加了一个我不理解的练习:“确保AtariLibrary类只包含LibraryUtils模块,让ActiveSupport :: Concern负责加载它然后,重构LibraryUtils上的self.included方法以使用包含的方法。“

module LibraryLoader

  extend ActiveSupport::Concern

  module ClassMethods
    def load_game_list
    end
  end
end

module LibraryUtils
  def self.included(base)
    base.load_game_list
  end
end

class AtariLibrary
  include LibraryLoader
  include LibraryUtils
end

基于解决方案(如下),似乎ActiveSupport::Concern没有负责加载依赖项 - 您需要在LibraryUtils中包含LibraryLoader。

你能帮助我理解ActiveSupport::Concern正在做什么,以及为什么需要在两个模块中通过extend调用它?

module LibraryLoader
  extend ActiveSupport::Concern

  module ClassMethods
    def load_game_list
    end
  end
end

module LibraryUtils
  extend ActiveSupport::Concern
  include LibraryLoader

  #result of refactoring the self.included method
  included do
    load_game_list
  end
end

class AtariLibrary
  include LibraryUtils
end

谢谢!

1 个答案:

答案 0 :(得分:5)

当您调用extend ActiveSupport :: Concern时,它将查找ClassMethods内部模块,并将使用它扩展您的“主机”类。然后它将为您提供一个“包含”方法,您可以将块传递给:

包含了  some_function 端

包含的方法将在包含的类的上下文中运行。如果您的模块需要另一个模块中的函数,ActiveSupport :: Concern将为您处理依赖项。