2011-09-26 34 views
0

我有一個試圖使用gnuplot gem的Rails應用程序,但Rails不會加載它。它在我的Gemfile中,我使用軟件包安裝進行安裝。捆綁知道這事:Ruby文件在搜索路徑中,但無法通過'require'找到

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,即使它的父目錄在搜索路徑中?

回答

6

它正在加載。如果庫已經加載,require語句的返回值將是false。當你啓動Rails控制檯時,它需要你的捆綁包中的所有寶石,所以再次需要它會給你false,就像你在這裏看到的那樣。要求對照每個傳遞給它的路徑,因此您可以通過它的相對路徑和絕對路徑來請求文件,並且它將同時加載兩次。這就是爲什麼當使用完整路徑時得到true結果--Ruby將它視爲不同的文件。

+0

感謝您的回覆。但看看我爲'Module.constants.include做的測試? :Gnuplot' - Gnuplot模塊似乎無法被解釋器訪問,直到我需要該文件的絕對路徑。此外,當我啓動rails控制檯時,如果我嘗試訪問Gnuplot模塊中的某些內容(例如Gnuplot :: gnuplot),則會得到NameError:未初始化的常量Gnuplot。但是,通過絕對路徑需要文件後,該調用正常工作。 –

+0

嗯。我無法複製。我剛做了一個新的Rails應用程序,添加了Gnuplot,打開了控制檯,並加載了它。你在用什麼版本的Rails? –

+0

感謝您的努力!您的評論啓發我找出最接近的原因 - 一個新鮮的Rails應用程序只有gnuplot工作正常,但將我的Gemfile複製到新項目中破壞了它。一次一個地註釋出寶石表明問題是gsl和gnuplot gem之間的不良反應 - 當gsl gem首先被加載時,gsl gem中的某些東西阻止了Gnuplot命名空間的正確顯示。真讓人頭痛,但現在我知道該怎麼辦了! –