ruby - 使用扩展 ActiveSupport::Concern

标签 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

谢谢!

最佳答案

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

included do
 some_function
end

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

关于ruby - 使用扩展 ActiveSupport::Concern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14917117/

相关文章:

javascript - 用于比较开始和结束日期的 jQuery 验证

ruby-on-rails - 使用 ActiveSupport::Concern 的 Rails mixin 不起作用

ruby-on-rails - rails 3.1 屈折问题

Ruby:为什么我在使用安全导航运算符时没有得到 nil

ruby - Nokogiri XML Builder 在抓取 HTML 时创建意外输出

ruby-on-rails - IRB 在尝试要求 "LoadError: cannot load such file -- nokogiri"时显示 "nokogiri"错误

ruby - IRB 有哪些替代方案?

ruby-on-rails - rake 任务中的无限循环在 ActiveSupport 日期范围内迭代

ruby-on-rails - 如果特定键,则哈希深度转换所有值

Ruby TZInfo 和 ActiveSupport::TimeZone 无法识别大多数时区缩写