在Rails 4.2.1中,我在m1
的另一个文件夹services
中添加了自定义文件夹app/services/m1
。在这个文件夹中,我添加了三个对应三个类的文件:app/services/m1/c1.rb
,app/services/m1/c2.rb
和app/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
作为正确的结果。
那么,为什么类foo1
和C1
的{{1}}方法之间存在差异?
答案 0 :(得分:0)
区别在于你定义类方法的方式,两种方式都是等价的。也许问题是您没有将app/services
目录添加到自动加载路径:
# config/application.rb
module MyApp
class Application < Rails::Application
# ...
config.autoload_paths += %W(#{config.root}/app/services)
# ...
end
end