【问题标题】:Rails 4.2.0 defined? returns inconsistent resultsRails 4.2.0 定义了吗?返回不一致的结果
【发布时间】:2015-12-08 11:28:12
【问题描述】:

Rails 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 

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

谢谢。

【问题讨论】:

    标签: ruby-on-rails-4.2 uninitialized-constant


    【解决方案1】:

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

    这是通过const_missing 钩子完成的,const_defined? 明确地是documented,因为它不会触发const_missing。实际使用常量会触发const_missing

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

    【讨论】:

      猜你喜欢
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多