假设我有这个
module Command
extend ActiveSupport::Concern
included do
@path ||= File.join("#{file_path}", "some_file")
end
def file_path
File.expand_path("some_other_file")
end
...
当包含该模块时,我得到undefined local variable or method file_path
。那么有一种方法可以在包含模块时识别file_path
方法吗? (当然没有在file_path
方法中放置included
)
答案 0 :(得分:1)
您正在方法file_path
,included
块中调用方法do..end
。这意味着将范围设置为Command
类。但file_path
是instance_method,因此Command.file_path
会抛出合法错误。您必须在包含file_path
模块的类的实例上调用方法Command
。一个例子来说明这一点 -
module A
def self.included(mod)
p foo
end
def foo
2
end
end
class B
include A
end
# `included': undefined local variable or method `foo' for A:Module (NameError)
错误即将发生,因为方法included
内部是A
。 A
没有名为foo
的类方法,因此错误就出来了。现在要解决它,我们应该如下所示:
module A
def self.included(mod)
p mod.new.foo
end
def foo
2
end
end
class B
include A
end
# >> 2
答案 1 :(得分:1)
你可以试试这个:
模块命令 扩展ActiveSupport :: Concern
def self.extended(klass)
@path ||= File.join("#{klass.file_path}", "some_file")
end
def file_path
File.expand_path("some_other_file")
end
然后将模块扩展到您调用它的位置!