2011-01-20 2 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

+0

もちろん。それは言うまでもありません:) – Geo

答えて

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> 
+0

(@ジオの明確なコメント)この(そうでなければ正しい)答えは質問されている質問に対する答えではないので、下降します。 – Phrogz

関連する問題