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

Tim*_*ith 0 ruby rubygems ruby-on-rails ruby-on-rails-3

我有一个试图使用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
Run Code Online (Sandbox Code Playgroud)

但它没有出现在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
Run Code Online (Sandbox Code Playgroud)

现在,检查模块的名称是否在常量表中:

ruby-1.9.2-p290 :003 > Module.constants.include? :Gnuplot
 => false
Run Code Online (Sandbox Code Playgroud)

不是!该模块不能真正访问.即使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
Run Code Online (Sandbox Code Playgroud)

如果我通过其完整路径显式包含文件,它可以工作!

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
Run Code Online (Sandbox Code Playgroud)

现在,解释器可以看到该模块.它从Rails外部工作得很好.

vp117025:src tim$ irb -rubygems -r gnuplot
ruby-1.9.2-p290 :001 > Module.constants.include? :Gnuplot
 => true
Run Code Online (Sandbox Code Playgroud)

为什么Rails环境不能加载gnuplot.rb,即使它的父目录在搜索路径中?

Jim*_*dra 6

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