'self.method_name'和'class<<之间的区别Ruby on Rails中的自我'

时间:2015-10-26 11:07:54

标签: ruby ruby-on-rails-4

在Rails 4.2.1中,我在m1的另一个文件夹services中添加了自定义文件夹app/services/m1。在这个文件夹中,我添加了三个对应三个类的文件:app/services/m1/c1.rbapp/services/m1/c2.rbapp/services/m1/c3.rb。每个文件的内容如下:

# app/services/m1/c1.rb
module M1
  class C1
    def self.foo1
      C2.foo2
    end
  end
end


# app/services/m1/c2.rb
module M1
  class C2
    class << self
      def foo2
        return 123
      end
    end
  end
end


# app/services/m1/c3.rb
module M1
  class C3
    class << self
      def foo1
        C2.foo2
      end
    end
  end
end

现在,在Rails控制台中,当我执行以下操作时:

# First Command
M1::C3.foo1

我收到以下错误:

NameError: uninitialized constant C2
from /path_to_the_app_directory/app/services/m1/c3.rb:5:in `foo1

但是,当我这样做时,就在上面的命令之后:

# Second Command
M1::C1.foo1

我得到123作为结果。在此之后,如果我执行以下操作:

# Third Command, same as First Command
M1::C3.foo1

我得到123作为正确的结果。 那么,为什么类foo1C1的{​​{1}}方法之间存在差异?

1 个答案:

答案 0 :(得分:0)

区别在于你定义类方法的方式,两种方式都是等价的。也许问题是您没有将app/services目录添加到自动加载路径:

# config/application.rb

module MyApp
  class Application < Rails::Application
    # ...

    config.autoload_paths += %W(#{config.root}/app/services)

    # ...
  end
end