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,即使它的父目录在搜索路径中?
它正在加载.false如果库已加载,则require语句的返回值.当你启动Rails控制台时,它需要你的捆绑中的所有宝石,所以再次需要它会给你false如你所见.要求对每个传递给它的路径进行公平处理,因此您可以通过其相对路径和绝对路径来获取文件,并且它将加载两次.这就是true使用完整路径时得到结果的原因- Ruby将其视为不同的文件.
| 归档时间: |
|
| 查看次数: |
1234 次 |
| 最近记录: |