如何制作可以在 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 单例方法(您的 self
是 pry
中 Plugin
的一个实例安慰)。这应该有效:
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
我可以通过例如访问模块 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 单例方法(您的 self
是 pry
中 Plugin
的一个实例安慰)。这应该有效:
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