2011-02-12 6 views
3

Herokuのためにそのままでは動作しない、Herokuに配備されたRailsアプリケーションのCSSとJSのパッケージ化にJammitを使用しようとしています。読み取り専用ファイルシステム。これを行う方法のすべての例では、パッケージ化されたアセットファイルをすべて事前にビルドすることを推奨しています。 HerokuのGitベースのデプロイメントのために、これは、これらのファイルが変更されるたびにリポジトリに別のコミットを行う必要があることを意味します。その代わりに、Jammitがキャッシュされたパッケージを書き込むために使用するパスを#{Rails.root}/tmp/assetsに変更する(ActionController::Base#page_cache_directoryを変更することによる)、これはHeroku上で書き込み可能です。ActionController :: Base#page_cache_directoryを変更してHerokuで静的アセットキャッシングを行う

キャッシュされたファイルが、キャッシュされたパッケージのデフォルトパスを使用していても毎回Railsスタックにぶつからずにどのように使用されるか分かりません。私は私が何を意味するかを説明してみましょう:

あなたはJammitのヘルパーを使用してパッケージが含まれている場合、それは次のようになります。

このスクリプトタグを生成
<%= include_javascripts :application %> 

<script src="/assets/application.js" type="text/javascript"></script> 

場合は、ブラウザのリクエストこのURLでは、実際にはJammit::Controller#packageにルーティングされ、パッケージの内容がブラウザに表示され、キャッシュされたコピーが#{page_cache_directory}/assets/application.jsに書き込まれます。アイデアは、このキャッシュされたファイルが最初のリクエストで構築され、後続のリクエストがRailsスタックにぶつかることなくキャッシュされたファイルを直接提供するということです。私はJammitコードを見て、どのように起こるはずなのか分かりません。後で/assets/application.jsへのリクエストが単にJammit::Controllerにルーティングされ、キャッシュされたファイルを使用することができないのはなぜですか?

私が推測していることは、ファイルが存在する場合にはそのファイルを提供していないRackミドルウェアがどこかにあり、要求がコントローラに転送されていることです。その場合、そのコードはどこですか? ActionController::Base#page_cache_directory(Jammitがキャッシュされたパッケージを書き込む場所を効果的に変更する)を変更すると、どのように動作しますか? #{Rails.root}/tmpは公開ドキュメントルートの上にあるため、そのパスにマップされているURLはありません。

答えて

5

大きな質問!私はこれを自分で設定していませんが、それは私が調べることを意味していたものなので、そうするよう促しました。ここで私は何をしようとしています(私はすぐに自分自身をショットを与えるだろうが、おそらく私にそれを打つつもりです)。それは今までにピックアップされませんので、ちょうどpublic/assetsに何かを持っていないことを確認してください

require ::File.expand_path('../config/environment', __FILE__) 
run Rack::URLMap.new(
    "/"  => Your::App.new, 
    "/assets" => Rack::Directory.new("tmp/page_cache/assets")) 

config.action_controller.page_cache_directory = "#{Rails.root}/tmp/page_cache" 

今すぐにあなたのconfig.ruを変更します。

注:

  • これはHerokuのは、ワニスにあなたの資産をキャッシュしますので、それが12時間にRack::Directoryセットキャッシュ制御ヘッダのように見えるのRails 2.
  • 下で溶液のレール3.わからないです。 Jammitがコントローラーにこれを設定しているかどうかは分かりませんが、そうでない場合でも非常に迅速にキャッシュされます。
  • ヘロクもENV['TMPDIR']に設定されていますので、ご希望の場合はRails.root + '/tmp'の代わりに使用することができます。
+0

しかし、Rails.root.join( 'tmp')を使用してください。 –

+0

この回答は2歳以上です。現代のソリューションは、Railsの資産パイプラインです。 http://guides.rubyonrails.org/asset_pipeline.html – wuputah

+0

多くの人がアセットパイプラインに迷惑をかけることを好みます。 –

0

これは別の宝石用ですが、アイデアは似ていて、私はそれをプレーンアセットヘルパーと連携させようとしています。

http://devcenter.heroku.com/articles/using-compass

残念ながら、レールが(結合スパゲティに似ている)資産ヘルパーモジュールを書き換え/パッチを適用せずにこれを行うために取得することは非常に困難であると考えられます。

関連する問題