如何制作可以在 class 和每个模型实例中访问的模块变量?

How to make module variables that can be accessible in class and in each model instance?

我可以通过例如访问模块 pluggins_list 方法@page.plugins.pluggins_list,但是如果我试图通过例如在 Plugin 模型中获取 Plugginable 方法或变量@page.page_elements.first.get_pluggin 我得到了 nil 或 undefined。如何使模块 pluggins 可以在外部访问并且它们可以在每个 Plugin 实例中可用?

编辑,更好的例子:

[3] pry(#<Plugin>)> plg = Plugin.new(name: "nutella")
=> #<Plugin id: nil, element_type: "Plugin", name: "nutella", page_id: nil>
[4] pry(#<Plugin>)> plg.get_pluggin
[5] pry(#<Plugin>)> plg.pluggins
=> nil
[6] pry(#<Plugin>)> pluggin_by_name(name)
NoMethodError: undefined method `find' for nil:NilClass

当前代码:

module Plugginable
  extend ActiveSupport::Concern
  attr_accessor :pluggins

  included do
    @pluggins = [{name: "dupa"},{name: "hello"}]
  end

  module ClassMethods
    def pluggins_list
      @pluggins
    end
  end

  def pluggin_by_name(name)
    @pluggins.find {|plg| plg.name === name.downcase }
  end

  module InstanceMethods
  end
end

class Plugin < PageElement
  include Plugginable

  def get_pluggin
    binding.pry
    # pluggin_by_name(name)
  end
end

您尝试在实例上调用 pluggin_by_name,这是 class 单例方法(您的 selfpryPlugin 的一个实例安慰)。这应该有效:

Plugin.pluggin_by_name(name)

此外,这部分:

included do
  @pluggins = [{name: "dupa"},{name: "hello"}]
end

没有意义。据我所知,您希望 @pluggins 作为 Plugin 的实例变量,但在此块中 self 肯定不是 Plugin 实例,但是,如果我记得的话正确,Plugin class。如果你想让 pluggins attr reader 工作,也许你应该设置某种默认值,像这样:

module Plugginable
  attr_writer :pluggins
  def pluggins
    @pluggins ||= [{name: 'dupa'}, {name: 'hello'}]
  end
end