2011-01-20 79 views
1

想象一下這樣的結構:有沒有簡單的方法來引用Sinatra中的公共目錄?

/project 
     /templates 
      view1.haml 
      view2.haml 
      misc_views/ 
      view3.haml 
      view4.haml 
      even_deeper/ 
       view5.haml 
     /public 
      script1.js 

模板的深度可以改變,我想指的是公共目錄,如果我想從它包含了一些文件。是否有助手或其他噱頭將我帶到公共目錄?在我的視圖中看起來像../../../public/script1.js或../../public/script1.js似乎不好。當然,一定有更好的辦法。

+0

要清楚,你知道這是不是你需要在發送到Web瀏覽器的HTML,包括磁盤上的文件之間的相對路徑,而是供應路線和根之間的相對路徑公共目錄?例如,如果你有`get(「/ foo」){haml'misc_views/even_deeper/view5.haml'}`那麼你的HTML應該有`src =「script1.js」`或`src =「/ script1.js 「`。 – Phrogz 2011-01-20 18:12:43

+0

當然。這是不言而喻的:) – Geo 2011-01-20 19:12:41

回答

3

您可以使用the settings.public configuration來引用公共目錄。例如:

get "/" do 
    js = File.join(settings.public, 'script1.js') 
    File.exists?(js) #=> true 
end 

由於這是一個絕對路徑,因此不需要使它與您的視圖相關來獲取文件。你可以從你的視角來了解這一點,但我會親自將該路徑設置爲來自控制器的實例變量。

get "/" do 
    # If you really only need the directory 
    @public = settings.public 

    # If you actually need the path to a specific file 
    @main = File.join(settings.public, 'main.js') 

    # If you actually need the contents of a file 
    @js = IO.read(File.join(settings.public, 'main.js')) 
end 
1

您必須通過Web地址的根目錄或相對請求路徑來包含靜態資源,因爲它將是請求它的瀏覽器,而不是服務器端代碼。除非我誤解你的情況?

<script type="text/javascript" src="/script1.js"></script> 
相關問題