0

导轨 4.2.0 / Ruby 2.2.1

defined?用于检查具有给定名称的类是否存在时,我面临不一致的行为。我想避免使用谓词方法来挽救异常。但如下所示,它返回的结果不一致。这种行为导致我在控制器中编写的一些代码失败。

$ rails c 
Loading development environment (Rails 4.2.0) 
2.2.1 :001 > defined?(User) 
=> "constant" 

2.2.1 :002 > defined?(AuthenticationToken) 
=> nil 

2.2.1 :003 > AuthenticationToken 
=> AuthenticationToken (call 'AuthenticationToken.connection' to establish a connection) 

2.2.1 :004 > defined?(AuthenticationToken) 
=> "constant"

我也尝试过使用Kernel.const_defined?但发现相同的不一致行为。

$ rails c
Loading development environment (Rails 4.2.0)
2.2.1 :001 > Kernel.const_defined?('Role')
 => false 
2.2.1 :002 > Kernel.const_defined?('AuthenticationToken')
 => false 
2.2.1 :003 > AuthenticationToken
 => AuthenticationToken (call 'AuthenticationToken.connection' to establish a connection) 
2.2.1 :004 > Kernel.const_defined?('AuthenticationToken')
 => true 

是否有任何标准方法可以使该代码以一致的方式运行?

谢谢。

4

1 回答 1

0

根本问题是,在开发模式下,rails 会按需加载您的应用程序代码——这些常量确实没有定义。

这是通过const_missing钩子完成的,并const_defined?明确记录为不触发const_missing。实际上使用常量会触发const_missing

您可以尝试打开config.eager_load以使 rails 在启动时加载所有代码,但这会使启动 rails 控制台、运行任务等变慢。我也不确定它如何与开发模式代码重新加载相结合。

于 2015-12-20T14:21:01.523 回答