2012-10-26 44 views
0

我在嘗試編寫一個Sinatra應用程序,該應用程序從文件中讀取列表,然後從該列表中吐出一個隨機項目。在Sinatra中讀取本地文件時出錯

雖然我無法找出文件的路徑來讀取它。特拉說,「沒有這樣的文件或目錄」當我嘗試在我的瀏覽器加載項:

Errno::ENOENT at /wod 
No such file or directory - http://localhost:4567/listing.txt 

下面是代碼:

require 'sinatra' 

@list 

get /item 
    puts read_list[rand(@list.size)] 
end 

def read_list 
    File.open('listing.txt', 'r').readlines 
end 

我在/public文件,其中西納特拉自述說是託管靜態文件的默認位置。此外,如果我將它放在/public中,我可以導航到localhost:4567/listing.txt並在瀏覽器中閱讀該文件。

+0

爲什麼'@ list'自己坐着?您的代碼示例不會通過語法檢查,因此它需要反映您的真實代碼。 –

回答

2

你需要做File.read('public/listing.txt', 'r')才能在這裏得到你想要的。

File.open不是Sinatra的一部分,也不知道在靜態文件的特定位置查找,所以它只是查看當前工作目錄。

3

一對夫婦的事情,我注意到:

get /item 

是不正確的,它應該是:

get '/item' do 

如果你開始的相同目錄中的Ruby代碼是,目前的內部代碼工作目錄將是".",這是在紅寶石看起來嘗試時:

File.open('listing.txt', 'r').readlines 

Ruby實際上將使用'./listing.txt'作爲路徑。如果您從應用程序的根目錄手動啓動代碼,那也沒有關係,但如果您嘗試從其他位置啓動該代碼,則該功能無法正常工作。

當您實際嘗試加載某些用於Web服務器的文件時,最好明確文件的位置。不要依賴機會,你可以做一些事情來幫助使它更加防彈。試想一下:

def read_list 
    running_dir = File.dirname(__FILE__) 
    running_dir = Dir.pwd if (running_dir == '.') 
    File.open(running_dir + '/public/listing.txt', 'r').readlines 
end 

File.dirname會從__FILE__路徑信息,這是當前正在運行的文件的絕對路徑和名稱。如果應用程序是從與該文件相同的目錄啓動的,那將是.,這不是我們想要的。在這種情況下,我們需要當前工作目錄的絕對路徑,它返回Dir.pwd。然後我們可以從應用程序的根目錄將它附加到所需文件的路徑。