SubURI での設定にした場合
sinatra アプリを Passenger で「Sub URI」で動かす(2) - @sugamasao.blog.title # => ”コードで世界を変えたい”で最後に書いた事に対する回答になるのだけれど。
sinatra アプリを単独で動かす場合(WebRick 等で動かした場合)と SubURI の設定をした Apache 等で動かした場合で、PATH_INFO が違うため静的コンテンツへのリンクに誤差が生じてしまいます。
img/hoge.png*1 のような相対パスで設定した場合は、sinatra アプリ内のパスから探してほしい。
そんな時どうするか
passenger の環境構築で作った、public ディレクトリを使用する。
正確には、sinatra アプリのソース内に、以下のように既述する。
set :public, File.dirname(__FILE__) + '/public'
こうすると、sinatra アプリ内での静的コンテンツを見る際は sinatraアプリのパス/public 配下を見るようになる。
例えば、public/img/hoge.png というファイルを作成しておき、view/index で src="img/hoge.png" のようにしてあげると、環境に寄らず sinatra アプリ内のディレクトリを見るようになる。
これで
sinatra アプリを動かす際に、本番と開発環境でパスが異なる>< のような自体は回避できますね。
参考資料
- Route 477 - Sinatra早見表 ここがおおいに参考になりました><
- Sinatra: README の Static Files のところ
*1:先頭にスラッシュが無い事に注意