如何创建可在类和每个模型实例中访问的模块变量?

时间:2015-01-08 08:57:31

标签: ruby-on-rails ruby ruby-on-rails-4 design-patterns module

我可以通过以下方式访问模块pluggins_list方法@page.plugins.pluggins_list,但如果我想通过例如Plugginable模型获取Plugin个方法或变量@page.page_elements.first.get_pluggin我没有或没有定义。如何使模块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

1 个答案:

答案 0 :(得分:1)

您尝试在实例上调用pluggin_by_name,这是类单例方法(您的selfPlugin控制台中pry的实例。这应该有效:

Plugin.pluggin_by_name(name)

此外,这部分:

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

毫无意义。根据我的理解,您希望@pluggins作为Plugin的实例变量,但在此块self当然不是Plugin实例,但是,如果我记得的话正确地,Plugin类。如果您希望pluggins attr阅读器工作,也许您应该设置某种默认值,如下所示:

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