3

アセット パイプラインを使用していない Rails アプリがあります。アセットは Yeoman ( http://yeoman.io/ ) と Grunt タスクによって管理されます。grunt-rev最近、デプロイ前にアセットを修正するために呼び出されるブラウザ キャッシュ バスティング タスクを導入しました。このタスクはアセットの名前を一意に変更し、フローは呼び出された別のタスクに渡されます。このタスクgrunt-useminは、html ファイルと css ファイルを新しいアセット名で更新してからパブリック フォルダーにコピーします。

たとえば、main.cssindex.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"}

そこで、うまくいくと思われるいくつかのアイデアを思いつきました。

  1. シンボリックリンクmain.css->f43ce6bf.main.css
  2. ビューヘルパーを追加してアセットを見つけます
  3. 大きすぎないため、javascript と css をビューにインライン化します。
  4. 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
4

0 に答える 0