我可以通过以下方式访问模块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
答案 0 :(得分:1)
您尝试在实例上调用pluggin_by_name
,这是类单例方法(您的self
是Plugin
控制台中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