在红宝石中使用包含的方法

时间:2013-11-04 10:17:43

标签: ruby-on-rails ruby include

假设我有这个

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

2 个答案:

答案 0 :(得分:1)

您正在方法file_pathincluded块中调用方法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内部是AA没有名为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

然后将模块扩展到您调用它的位置!