当类名等于模块名时,rails服务器会混淆

时间:2013-12-05 23:53:25

标签: ruby-on-rails ruby-on-rails-4 webrick

[前言:这个问题大多是空闲的好奇心 - 有明确的解决方法 - 但答案可能会让我深入了解一些我不理解的基本知识。]

我一直在使用命名空间模型,其中类名也是模块名,如下所示:

# 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

...但我仍然很好奇为什么服务器感到困惑(并且控制台没有)。

0 个答案:

没有答案