我有一个试图使用gnuplot gem的Rails应用程序,但是Rails不会费心去加载它。它在我的Gemfile中,我用bundle install安装它。 Bundle知道它:
vp117025:src tim$ bundle show gnuplot
/Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/gnuplot-2.3.6
但它没有出现在Rails控制台中(并且无法从我的应用程序访问),即使是在明确的要求之后,这也不是必需的。
vp117025:src tim$ rails console
Loading development environment (Rails 3.1.0)
ruby-1.9.2-p290 :001 > require 'gnuplot'
=> false
ruby-1.9.2-p290 :002 > require 'gnuplot.rb'
=> false
现在,检查模块的名称是否在常量表中:
ruby-1.9.2-p290 :003 > Module.constants.include? :Gnuplot
=> false
不是!该模块不能真正访问。即使require搜索路径包含保存gnuplot.rb的目录,也会发生这种情况。
ruby-1.9.2-p290 :004 > $:.include? "/Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/gnuplot-2.3.6/lib"
=> true
如果我以完整路径显式包含文件,它就可以了!
ruby-1.9.2-p290 :005 > require "/Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/gnuplot-2.3.6/lib/gnuplot.rb"
=> true
ruby-1.9.2-p290 :006 > Module.constants.include? :Gnuplot
=> true
现在,解释器可以看到该模块。它从Rails外部工作得很好。
vp117025:src tim$ irb -rubygems -r gnuplot
ruby-1.9.2-p290 :001 > Module.constants.include? :Gnuplot
=> true
为什么Rails环境无法加载gnuplot.rb,即使其父目录位于搜索路径中?
答案 0 :(得分:6)
正在加载。如果库已加载,则require语句的返回值将为false
。当您启动Rails控制台时,它需要捆绑中的所有宝石,因此再次需要它将为您提供false
,如您所见。要求对每个传递给它的路径进行公平处理,因此您可以通过其相对路径和绝对路径来获取文件,并且它将加载两次。这就是为什么在使用完整路径时得到true
结果 - Ruby将其视为不同的文件。