[前言:这个问题大多是空闲的好奇心 - 有明确的解决方法 - 但答案可能会让我深入了解一些我不理解的基本知识。]
我一直在使用命名空间模型,其中类名也是模块名,如下所示:
# file: external.rb
module External
require 'external/external.rb'
require 'external/other.rb'
end
# file: external/external.rb
module External
class External < ActiveRecord::Base ; end
end
# file: external/other.rb
module External
class Other < External ; end
end
当我在rails控制台中运行它时,没有问题。但是当我在服务器下运行它时,我收到错误:
ActionView::Template::Error (superclass must be a Class (Module given)):
在class Other < External
行。显然,这会使类名与模块名混淆。为什么是这样?由于类定义在外部模块的范围内,因此不应将其明确解释为class External::Other < External::External
?
当然有几种方法可以解决这个问题。一种是完全限定类名,如:
module External
class Other < External::External ; end
end
更熟悉的方法和我最终的方法是简单地将External类重命名为Base:
# file: external.rb
module External
require 'external/base.rb'
require 'external/other.rb'
end
# file: external/base.rb
module External
class Base < ActiveRecord::Base ; end
end
# file: external/other.rb
module External
class Other < Base ; end
end
...但我仍然很好奇为什么服务器感到困惑(并且控制台没有)。