すがブロ

sugamasaoのhatenablogだよ

sinatra での SubURI アクセスで、静的コンテンツにリンクする方法

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 アプリを動かす際に、本番と開発環境でパスが異なる>< のような自体は回避できますね。

参考資料

*1:先頭にスラッシュが無い事に注意