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はありません。
しかし、Rails.root.join( 'tmp')を使用してください。 –
この回答は2歳以上です。現代のソリューションは、Railsの資産パイプラインです。 http://guides.rubyonrails.org/asset_pipeline.html – wuputah
多くの人がアセットパイプラインに迷惑をかけることを好みます。 –