0

假设我有这个

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

4

2 回答 2

1

您正在调用方法file_path,在方法中includeddo..end块。这意味着范围设置为Command类。但是file_pathinstance_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)

错误来了,因为在方法includedself 内部是A. A没有名为 as 的类方法foo,因此出现错误。现在要修复它,我们应该如下调用它:

module A
    def self.included(mod)
        p mod.new.foo
    end
    def foo
        2
    end
end

class B
    include A
end

# >> 2
于 2013-11-04T10:19:56.660 回答
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

然后在你调用它的地方扩展你的模块!

于 2013-11-04T10:38:14.660 回答