2012-11-08 17 views
1

我使用Ruby v1.9.2和Ruby on Rails v3.2.2。我有很多模型类具有常量的语句。例如:是否与类的加载顺序有关的“未初始化常量”错误?

# app/models/class_one.rb 
class ClassOne < ActiveRecord::Base 
    CONSTANT_ONE = ClassTwo::CONSTANT_TWO 
end 

# app/models/class_two.rb 
class ClassTwo < ActiveRecord::Base 
    CONSTANT_TWO = 1 
end 

当我重新启动服务器,我收到以下错误:

Routing Error 
uninitialized constant ClassTwo::CONSTANT_TWO 
Try running rake routes for more information on available routes. 

有关文件的加载顺序错误(等类)?我应该如何解决这个问题?

注意:由于Ruby on Rails,我听说“工作”解决方案可能是初始化文件中的状态常量(在config/initializers/目录中)。如果是这样,那应该如何做出正确的做法?你有什么想法?

回答

0

Rails中的常量是一种痛苦,正如你开始发现的那样。只有真正深入了解,疼痛才会增加。在类上使用实际方法要比使用常量更容易,更易于维护。例如,在测试中,修改方法比覆盖各种用例时的常量要容易得多。另外,当进行更复杂的编程时,您可能会开始加载问题(如多个加载错误或像您一样无法使用),这些问题不会在方法中发生。我已经停止在我的Rails应用程序中使用常量,并且一点都不会错过它们。您可能会对an article that Advi Grimm wrote感兴趣,以达到同样的效果。

编辑:

如果你真的希望使用常量,在您所描述的方式,检查出Where's the best place to define a constant in a Ruby on Rails application?获取更多信息。

+0

但是,在测试中,为了使事情“更容易”,您可以更明确地(通过陈述常量的全名)而不是使用方法。 – user12882

+0

在我的情况与常量有关的是“初始化方法”(在您喜欢的问题中提到“[哪里是在Ruby on Rails应用程序中定义常量的最佳位置?](http://stackoverflow.com/questions/1107782/RoR开发人员“/”RoR开发人员“/”通过RoR应用程序实现RoR应用程序“中常用的”最佳位置定义常量 - 应用程序 - 红宝石应用程序“)? – user12882

+0

如果将常量设置为true,那么我想到的用例就像(常见的简单示例),并且您希望在测试中验证如果将其调整为false将会失败。这种类型的东西总是出现在现实世界的例子中,比我的快速例子复杂得多(比如每页计数,例如分页),但希望你明白这一点。这种事情几乎不可能令人满意地使用常量。 –

0

这两个类是在同一个文件中定义的?哇。重新排列类别:

class ClassTwo < ActiveRecord::Base 
    CONSTANT_TWO = 1 
end 

class ClassOne < ActiveRecord::Base 
    CONSTANT_ONE = ClassTwo::CONSTANT_TWO 
end 

应该修复它。 CONSTANT_ONE = ClassTwo :: CONSTANT_TWO在解析后立即进行评估。

+0

类*不*在同一个文件中定义。我更新了这个问题,以便说明这一点。保持冷静。 – user12882

+0

a ** require'class_two'**作为class_one.rb的第一行然后会执行:) – 2012-11-08 23:51:43

+0

由于Ruby on Rails,我听说解决方案可能是在初始化文件中声明常量(在config /初始化程序/'目录)。你有什么想法? – user12882