Ruby文件在搜索路径中,但'require'找不到

时间:2011-09-26 07:32:52

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems

我有一个试图使用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,即使其父目录位于搜索路径中?

1 个答案:

答案 0 :(得分:6)

正在加载。如果库已加载,则require语句的返回值将为false。当您启动Rails控制台时,它需要捆绑中的所有宝石,因此再次需要它将为您提供false,如您所见。要求对每个传递给它的路径进行公平处理,因此您可以通过其相对路径和绝对路径来获取文件,并且它将加载两次。这就是为什么在使用完整路径时得到true结果 - Ruby将其视为不同的文件。