ruby
  • sinatra
  • erb
  • 2010-05-11 60 views 4 likes 
    4

    我正在使用以下代碼在我的erb文件中發佈圖像之前檢查文件的存在。這是一個ruby/sinatra應用程序 - 不是rails。Sinatra視圖內的相對路徑問題

    <% @imagename = @place.name + ".jpg" %> 
    <% if FileTest.exist?("/Users/Tim/projects/game/public/" + @imagename) %> 
    <p><img src= '<%= @imagename %>' width="400" height="300" /> </p> 
    <% end %> 
    

    而當我發佈到Heroku,它顯然不會工作。

    我嘗試使用相對路徑,但我無法得到它的工作:

    <% if FileTest.exist?("/" + @imagename) %> 
    

    回答

    9

    的路徑開始與/是不是相對路徑,這是一個絕對路徑。它說轉到根目錄,然後導航到以下路徑

    第一步是檢查應用程序的運行位置。即當前目錄是什麼。要做到這一點暫時把<%= Dir.pwd %>在你的看法,並嘗試在本地和在Heroku比較兩個環境。

    然後嘗試從該文件夾到圖像的相對路徑。例如如果應用程序是從/Users/Tim/projects/game運行,那麼公衆的相對路徑就是public這樣的路徑,圖像會File.join('public', @imagename)

    如果您需要更多的幫助,那麼請從兩種環境張貼Dir.pwd


    這裏是另一種方法:

    __FILE__是一個特殊的Ruby變量,使當前文件的相對路徑。

    利用這一點,在開始你的應用程序的文件名爲.rb設置一個常數如下:

    APP_ROOT = File.dirname(__FILE__) 
    

    (應用程式的config.rb類似的線是用來設置RAILS_ROOT在Rails應用程序)

    然後在您的視圖中,可以使用:

    FileTest.exist?(File.join(APP_ROOT, 'public', @imagename)) 
    
    +0

    我如何在Sinatra做到這一點? – 2010-05-11 21:08:04

    +0

    已更新爲上面的Sinatra。讓我知道這是否有幫助。 – mikej 2010-05-11 21:25:58

    +0

    這種方法的工作原理如下: 「然後嘗試從這個文件夾到圖像的相對路徑,例如,如果應用程序從/ Users/Tim/projects/game運行,那麼公共的相對路徑是公共的,因此圖像的路徑會是File.join('public',@imagename)「 APP_ROOT方法遊戲我一個統一的常量錯誤。工作中。謝謝MikeJ! – 2010-05-11 21:46:42

    0

    你想要什麼是使用RAILS_ROOT不變 - 它指向應用的文件夾。因此,在您的本地計算機RAILS_ROOT將評估爲/Users/Tim/projects/game/

    這是Rails特定的,請使用File.dirname(__FILE__)代替。

    +0

    真的嗎?在sinatra應用程序? – 2010-10-02 16:53:23

    +0

    在解決方案發布後澄清。在這種情況下'文件。dirname(__ FILE __)'可能會有訣竅。 – 2010-10-06 21:49:49

    相關問題