`uninitialized constant`错误

时间:2013-08-11 05:55:52

标签: jruby jrubyonrails

我有以下使用java类javax.naming.InitialContext的jruby代码:

if RUBY_PLATFORM == "java"
  require 'java'
  import javax.naming.InitialContext

  module JndiProperties
    def self.getProperty(name)
      begin
        env.lookup(name).to_s
      rescue
        nil
      end
    end

    def self.[](name)
      getProperty(name)
    end

    private
    def self.env
      context = InitialContext.new
      environment = context.lookup 'java:comp/env'
      environment
    end
  end
else
  module JndiProperties
    def self.getProperty(name)
      nil
    end

    def self.[](name)
      getProperty(name)
    end
  end
end

我在database.yml中使用此模块来配置数据库连接。 E.g:

username: <%= JndiProperties['ANTARCTICLE_DB_USER'] || 'root' %>

当我尝试运行rails应用程序时,我得到uninitialized constant JndiProperties::InitialContext。如果我尝试从irb使用此模块,它将按预期工作。

1 个答案:

答案 0 :(得分:1)

只需将导入行放入模块:

module JndiProperties
  java_import 'javax.naming.InitialContext'
end

因为它使用const_missing手动解析或分配常量:

InitialContext = Java::JavaxNaming::InitialContext

甚至应该在模块之外工作