今天早些时候,当我跑步时,我遇到了这个问题
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 `<top (required)>'
但是Report
是没有任何拼写错误的AR类/模型。
发生错误的原因是,在项目中,先前已定义了名为Report
的模块。
为什么同一个类和模块名称出现此问题?
是否有任何Ruby / Rails约定没有命名具有相同名称的类和模块?
答案 0 :(得分:2)
您不能为Class
和Module
重复使用相同的名称。在内部,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
。
答案 1 :(得分:1)
是否有任何Ruby / Rails约定没有命名具有相同名称的类和模块?
class
关键字执行两项操作 - 它创建一个新类并将其分配给给定的常量,或者根据给定的常量重新打开现有的类。 (module
)
在后一种情况下,如果常量不是预期的类,它也会引发错误。无论是模块还是其他对象都无关紧要:
Report = 123
class Report
end
#=> TypeError: Report is not a class