Campingでは、cssなどの静的ファイルを提供するのにどのように最適ですか?
今私は持っています
class Style < R '/cards.css'
def get
@headers["Content-Type"] = "text/css"
File.read('cards.css')
end
end
ラックを使用するよりスマートな方法はありますか?
静的ファイルに対するCampingの現在の(RubyGemsから最新バージョンをインストールすることを忘れないでください!)スタンスは、サーバーが静的ファイルの提供を担当する必要があるというものです。
camping
-commandを使用すると、 public/
-directoryが自動的に提供されます。に移動cards.css
するだけpublic/cards.css
で、localhost:3301/cards.cssがファイルを返すはずです。
本番環境では、-ディレクトリから直接ファイルを提供するようにApache / Nginx/whateverを構成する必要がありますpublic/
。
Apache / Nginxを構成できない場合(Herokuなど)、次のようなカスタムconfig.ruを作成できます。
# Your Camping app:
app = MyApp
# Static files:
files = Rack::File.new('public')
# First try the static files, then "fallback" to the app
run Rack::Cascade.new([files, app], [405, 404, 403])
(これは、Camping :: Serverが内部で行うことです:https ://github.com/camping/camping/blob/5201b49b753fe29dc3d2e96405d724bcaa7ad7d4/lib/camping/server.rb#L151 )
小さなファイルの場合は、app.rbのDATAブロックに保存できます:https ://github.com/camping/camping/blob/5201b49b753fe29dc3d2e96405d724bcaa7ad7d4/test/app_file.rb#L37
これは、すべてを1つのファイル内に保持する場合にも役立ちます。
Camping.goes :Foo
__END__
@@ /cards.css
...
Campingは、ファイル拡張子を使用して正しいContent-Typeを設定します。
また、Campingの最新バージョンにはserve
、Content-Typeを処理する-methodがあります。コントローラを次のように単純化できます。
class Style < R '/style.css'
def get
serve "cards.css", File.read("cards.css")
end
end
ドキュメントが悪いことをお詫びする必要があります。今のところあなた
もともとwhytheluckystiffによる提案は次のとおりです。
class Static < R '/static/(.+)'
MIME_TYPES = {
'.html' => 'text/html',
'.css' => 'text/css',
'.js' => 'text/javascript',
'.jpg' => 'image/jpeg',
'.gif' => 'image/gif'
}
PATH = File.expand_path(File.dirname(@__FILE__@))
def get(path)
@headers['Content-Type'] = MIME_TYPES[path[/\.\w+$/, 0]] || "text/plain"
unless path.include? ".." # prevent directory traversal attacks
@headers['X-Sendfile'] = "#{PATH}/static/#{path}"
else
@status = "403"
"403 - Invalid path"
end
end
end
PS-実際、ファイルのアップロードやセッションなど、他の素晴らしいアイデアをここで見つけることができます。