2013-05-23 11 views
9

Rails 4ではページキャッシュとアクションキャッシュが削除されて以来、Rails 4で変数を持たず、ビュー内にhtmlしか持たないアクションをキャッシュする方法は何ですか?私はビュー内の静的なHTMLをキャッシュする必要がありますか?有効期限を設定するモデルがない場合、どのようにetag/fresh_whenを設定するのですか?私は、キャッシュする最も簡単なページであるべきものをキャッシングするための例やコンベンションを見つけるのに苦労しています。Rails 4の静的アクションのキャッシング/ Etag 4

ビューは完全に静的ですが、ユーザーがサインインしているかどうかによってページにはダイナミックナビゲーションバーが表示されます。このような静的なページを処理するには、アクションキャッシュに頼らずに削除されていて、慣例がgemのバージョンを使用しないように設定されているからです。

例:

class HomesController < ApplicationController  
    def index 
    end 
end 

家/ index.html.erb

<div>A bunch of normal html tags with no erb</div> 

編集:は@ SEVERINの答えと私自身の研究に基づいて、ここで私が出ているものです これまでのところ。また

class HomesController < ApplicationController  
    def index 
    fresh_when(["some-identifier", current_user, flash]) 
    end 
end 

ビューがが展開する間に変更されている可能性があるため、私が展開した後、すべてのetagsをリセットするためにhttps://github.com/n8/bust_rails_etagsを使用しています。私はこれがかなり好都合にカバーしていると思いますが、私はまだ新鮮であるかどうか、自動的にビューについての何らかの識別子を含めるかどうか、そして「何らかのidnetifier」が必要かどうか不思議です。 current_userとflashがnilになることがありますか?

今、静的コンテンツをキャッシュするフラグメントの2番目のポイントです。私は私がやった場合と仮定しています:

cache "v1" do 
    all my html 
end 

私はページが私のアプリは、古いコンテンツを提供するだろうそうでない場合は変更されたときに、常にキャッシュ識別子を変更してくださいする必要があると思います。これを自動化する方法もあれば、すでにレールで処理している方法もありますか?ビューが更新された最後の時間や賢明なものをキャッシュするだけでいいので、静的なコンテンツが変更されたときに追跡する必要はありません。

+0

私は私の答えであなたの質問の第2部に答えました。不明な点がある場合やその他のご質問がある場合は、お気軽にお問い合わせください:) – severin

答えて

10

あなたは、モデルなしでデータに変更され、最後のETag /設定マニュアルを確認することができます:http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-fresh_when

だからあなたのようなものを行うことができます:

def index 
    fresh_when(:etag => 'some_made_up_etag', :last_modified => a_long_time.ago, :public => true) 
    render 
end 

注:あなたが提供する必要はありませんが最終的にタイムスタンプで修正されたエタグANDであり、エタグまたはタイムスタンプで最後に変更されたものだけを提供することができます。

これに加えて、私はまた、ビューの内容全体をフラグメント化します。

それとも、単に公式のプラグイン/宝石を使用してアクション(Action)/ page_cachingを使用し続けることができる:https://github.com/rails/actionpack-page_caching


あなたの質問の後半部分に関してはいくつかの追加:

RailsはRAILS_CACHE_IDの内容が追加されます環境変数をすべてのキャッシュキー(例では、etagとフラグメントキャッシュキー)に設定します。 bust_rails_etags gemは、etagsにのみ影響を与える別の環境変数を追加します...したがって、あなたの場合は、bust_rails_etags gemを削除して、すべてのデプロイメントでRAILS_CACHE_ID環境変数を更新するだけです。

あなたものconfig/environment.rbににこのような何かを追加することにより、RAILS_CACHE_ID環境変数の更新を自動化することができます。

code_revision = # ... some piece of code that gets the current revision. 
       # I'm using git and I use the following (crude) piece of 
       # to get the current revision: 
       # code_revision = `git log --pretty=format:%h -n1`.strip 
ENV['RAILS_CACHE_ID'] = code_revision 

この方法では、現在のコードのリビジョンは常にすべてのキャッシュキーに追加されます。

+0

はい、これは私が考えている行に沿ったものです。私は静的なキャッシングに関するいくつかの質問で私の質問を更新しました。 – John

+0

あなたの答えは私が探していたものでした。私はherokuがgitコマンドでエラーを投げていたので、gitの代わりにheroku deployタグを使用しています。これはうまくいくようです! – John

+0

rails 4 etagは[rails 4 zombie owtlaws](http://rails4.codeschool.com/videos)スクリーンキャストで十分カバーしています – equivalent8