5

Campingでは、cssなどの静的ファイルを提供するのにどのように最適ですか?


今私は持っています

class Style < R '/cards.css'
    def get
         @headers["Content-Type"] = "text/css"
         File.read('cards.css')
    end
end 

ラックを使用するよりスマートな方法はありますか?

4

2 に答える 2

9

静的ファイルに対する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

ドキュメントが悪いことをお詫びする必要があります。今のところあなた

于 2012-10-21T11:44:11.720 に答える
2

もともと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-実際、ファイルのアップロードやセッションなど、他の素晴らしいアイデアをここで見つけることができます。

于 2012-10-20T23:11:16.810 に答える