Rails项目中具有相同名称的模块和类

今天早些时候,当我跑步时,我遇到了这个问题

sidekiq 

我收到以下错误:

 I, [2015-09-04T12:43:33.723243 #15197] INFO -- : Celluloid 0.17.1.2 is running in BACKPORTED mode. [ http://git.io/vJf3J ] Report is not a class /home/andreydeineko/employees/app/models/report.rb:1:in `' 

Report是没有任何拼写错误的AR类/模型。

它发生的错误是由于事实,在项目中有先前定义的模块称为Report

为什么同一个类和模块名称出现此问题?

是否有任何Ruby / Rails约定没有命名具有相同名称的类和模块?

您不能为ClassModule重用相同的名称。 在内部,Ruby模块表示为类结构,因此它们共享相同的对象空间。

此外,在定义Module / Class时,可以将名称作为常量访问。

 class Report def foo p "report" end end Report => Report defined? Report => "constant" 

其实你也可以写

 Report = Class.new do def foo p "report" end end report = Report.new report.foo 

简而言之,如果将Report定义为Class ,则无法创建具有相同名称的Module

是否有任何Ruby / Rails约定没有命名具有相同名称的类和模块?

class关键字做两件事 – 它要么创建一个新类并将其分配给给定的常量,要么根据给定的常量重新打开现有的类。 ( module相同)

在后一种情况下,如果常量不是预期的类,它也会引发错误。 无论是模块还是其他对象都无关紧要:

 Report = 123 class Report end #=> TypeError: Report is not a class