2

Ruby on Rails 3.1 では、次のディレクトリにいくつかの JPG があります。

assets/images/subdir1/subdir2/myimage.jpg

これらの画像は、Web サイトで JavaScript を介して動的に読み込まれます (img.src = "assets/subdir1/subdir2/myimage.jpg")。何らかの理由で、それらは本番環境でキャッシュされず、代わりに cache-control: no-cache で提供されています。

これらの画像が確実にキャッシュされるようにするにはどうすればよいですか?

私の production.rb ファイルには、次のようなものがあります。

  # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
  config.assets.precompile += ['jquery-1.8.3.min.js', 'json2.min.js']

そのコメントに基づいて、画像は既にキャッシュされていると考えました。

詳細を編集してください:

JavaScriptは私が書いたカスタムJSです。基本的に、Ruby on Rails ディレクトリにビルドしてコピーするカスタム JS プロジェクトがあります。このカスタム JS 内で、img.src = "mydomain.com/assets/subdir1/subdir2/myimage.png"; のようなことを行います。これは機能しますが、イメージは RoR によってキャッシュされません。subdir1 で再帰的に見つかったすべての画像がキャッシュ可能であることを RoR に伝える方法があるでしょうか? – ジェフは今編集

別の編集:

ファイルを提供する独自のハンドラーを作成して、キャッシュする必要があると言うことができるでしょうか?

または、フォルダーに特別な構成ファイルを配置します (Apache サーバーの .htaccess など?)

確かにこれを行う方法はあります...

4

3 に答える 3

2

ファイルを提供するには、レールのヘルパーを使用する必要があります。そうして初めて、レールはこのファイルが変更されたかどうかを知ることができます。ヘルパーを使用すると、Rails はどのファイルが変更されたかを認識し、正しいパスを提供します。これを試して:

# access to asset_path through helper.
img.src = "<%= asset_path('subdir1/subdir2/myimage.jpg') %>"   

アセット パイプラインを正しく使用すると、レールはファイルの変更時にファイルへの新しいパスを生成し、同じ URL の背後にある新しい画像と戦うことはありません。

例があります。詳細については、アセット パイプラインの Ruby on Rails ガイドを参照してください。パラグラフ2.2.3 JavaScript/CoffeeScript および ERBを参照してください。

于 2013-01-06T19:49:13.083 に答える
1

正確には、どのようなキャッシングですか?画像が提供される http ヘッダーを変更したい場合、これは実際には Web サーバー (Apache) の設定方法に関する問題です。

rails で public/assets ディレクトリにキャッシュしたい場合は、デロイ時にアセットのプリコンパイル rake タスクを実行する必要があると思いますが、必要ないかもしれません。

于 2013-01-16T16:14:14.300 に答える
0

通常、本番環境のような環境では、静的アセットを提供するためにapache/nginxなどを使用します。Railsアプリで静的コンテンツを提供する場合は、構成で有効にする必要があります

config.serve_static_assets = true
config.static_cache_control = "public, max-age=172800"

これについては、このスレッドでも説明されています。RAILS3.1のjsアセットにCache-Controlヘッダーを設定する

于 2013-01-19T11:05:20.020 に答える