2011-01-20 50 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> 
相关问题