Heroku にデプロイされた Rails アプリの CSS と JS をパッケージ化するために Jammit を使用しようとしていますが、Heroku の読み取り専用ファイル システムが原因でそのままでは機能しません。これを行う方法について私が見たすべての例では、パッケージ化されたすべてのアセット ファイルを事前にビルドすることを推奨しています。Heroku は Git ベースでデプロイされているため、これらのファイルが変更されるたびにリポジトリに個別にコミットする必要があり、これは私にとって受け入れられる解決策ではありません。代わりに、Jammit がキャッシュされたパッケージを書き込むために使用するパスを変更したいと思います#{Rails.root}/tmp/assets
(変更することにより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
再度ルーティングされ、キャッシュされたファイルが使用されないようにするのを妨げるものは何ですか?
私の推測では、ファイルが存在する場合はファイルを提供し、存在しない場合はリクエストをコントローラーに転送する、私が見ていない場所にラックミドルウェアがあると思います。その場合、そのコードはどこにありますか? ActionController::Base#page_cache_directory
また、変更する場合(Jammit がキャッシュされたパッケージを書き込む場所を効果的に変更する場合)、どのように機能しますか? #{Rails.root}/tmp
はパブリック ドキュメント ルートの上にあるため、そのパスにマップされる URL はありません。