アセット パイプラインを使用していない Rails アプリがあります。アセットは Yeoman ( http://yeoman.io/ ) と Grunt タスクによって管理されます。grunt-rev
最近、デプロイ前にアセットを修正するために呼び出されるブラウザ キャッシュ バスティング タスクを導入しました。このタスクはアセットの名前を一意に変更し、フローは呼び出された別のタスクに渡されます。このタスクgrunt-usemin
は、html ファイルと css ファイルを新しいアセット名で更新してからパブリック フォルダーにコピーします。
たとえば、main.css
次index.html
のようになります。
<link rel="stylesheet" href="styles/main.css">
そして、次のように書き直します:
<link rel="stylesheet" href="styles/f43ce6bf.main.css">
アセットは Yeoman によって動的に生成されるため、Rails アプリはローカル開発で問題なく動作します。しかし、一度デプロイすると、assets パブリック フォルダーにはすべての更新済みアセットが含まれ、Rails ビュー (haml で記述) はそれらを見つけることができません。以下のようなリンクは現在死んでいます...
%link{:href => "/styles/main.css", :media => "screen,print", :rel => "stylesheet"}
そこで、うまくいくと思われるいくつかのアイデアを思いつきました。
- シンボリックリンク
main.css
->f43ce6bf.main.css
- ビューヘルパーを追加してアセットを見つけます
- 大きすぎないため、javascript と css をビューにインライン化します。
- grunt-usemin を fork して haml サポートを追加し、Rails 内のビューに対して実行します
しかし、何が一番いいのかわからない?または、もっと簡単な解決策がありませんか?
更新:私は今、以下のようなヘルパーを使用しています
module ApplicationHelper
def busted_css
@busted_css ||= begin
if Rails.env != "development"
File.join("/styles",
File.basename(Dir["public/styles/*main.css"].sort_by {|f| File.mtime(f)}.reverse[0])
)
else
"/styles/main.css"
end
end
end
end