2

json 呼び出しをキャッシュするように設定されたアプリケーションがあります。さまざまなコード構文を試しましたが、次の場合にのみ正しくキャッシュされるようです:

    caches_page :index, :gzip => true
    cache_sweeper :institutes_sweeper

    respond_to :json, :js

    def index
      @institutes = Institute.select([:id, :name]).all
      render :json => { :institutes => @institutes }
    end

これがヒットすると、html ファイルがレンダリングされ、キャッシュが期待どおりに機能します。Rails スタックはヒットしません。

フォーマット ブロックをスローしてレンダリングを json に応答させると、キャッシュによってファイルが作成されます。ただし、次回は別のファイルが作成され、既存のファイルは無視されます。

期待どおりに動作するには、Apache を別の方法で構成する必要がありますか?

また、キャッシュを格納するディレクトリとして public/cache/ を使用したいと思います。レールを正しく構成しました。ただし、これらのキャッシュされたファイルを提供するようにApacheを構成する方法を考えていました(ファイルが作成されても提供されない場合、上記と同じ問題が発生します)。

ご助力いただきありがとうございます!

4

1 に答える 1

2

ここで私の問題の解決策を残したかっただけです。

キャッシュされたファイルが存在する場所を Apache に通知する必要があります。パブリック領域に格納されているだけで機能する理由は、Apache がデフォルトでそのように動作するためです。仮想ホストを定義する場所に次の構成を追加します

RailsAllowModRewrite On
RewriteEngine On

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{REQUEST_URI} ^/([^.]+)$
RewriteCond %{DOCUMENT_ROOT}/cache/%1.json -f
RewriteRule ^/[^.]+$ /cache/%1.json [QSA,L]

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{DOCUMENT_ROOT}/cache/index.json -f
RewriteRule ^/$ /cache/index.json [QSA,L]

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{REQUEST_URI} ^/([^.]+)$
RewriteCond %{DOCUMENT_ROOT}/cache/%1.html -f
RewriteRule ^/[^.]+$ /cache/%1.html [QSA,L]

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{DOCUMENT_ROOT}/cache/index.html -f
RewriteRule ^/$ /cache/index.html [QSA,L]

さて、html をレンダリングする json の問題に取り組んでいると、実際の関数が実行される前に実行されるアプリケーション コントローラーでの呼び出しが原因であることがわかりました。それらの関数で skip_before_filter を使用すると、一歩近づきます。

また、応答をフォーマット ブロックでラップする方がよいこともわかりました。

respond_to do |format| 
  format.json { json: { institutes: @institutes } }
end

これにより、json がキャッシュされ、サーバー構成により正しく提供されます。

Nginx を使用している場合は、次の構成を使用する必要があると思います (ただし、100% 確実ではありません)。

    if (-f $request_filename/index.html) {
      rewrite (.*) $1/cache/index.html break;
    }

    if (-f $request_filename/index.json) {
      rewrite (.*) $1/cache/index.json break;
    }

上記のコードについてフィードバックがある場合は、ぜひお聞かせください。ありがとう!

于 2012-10-17T20:42:58.630 に答える