12

show アクションをキャッシュしているコントローラーがあります。show アクションには、ユーザーがログインしていない場合や現在のグループのメンバーではない場合などに実行およびリダイレクトすることを目的とした、セキュリティのための多数の before フィルターがあります。これらの before フィルターは、キャッシュをオンにしていない場合に完全に機能しますが、フィルターが実行されなくなる前に、スイッチを切り替えてキャッシュをオンにすると (私のデバッガー呼び出しはヒットしません)。

フィルターがキャッシュされたアクションに対して呼び出される前に、これがページ キャッシングとアクション キャッシングの主な違いであることを常に理解しています。これは、アクションキャッシングに関する Rails Caching Tutorial セクションによって裏付けられています。

アクション キャッシングはページ キャッシングと同じように機能しますが、受信した Web リクエストが Web サーバーから Rails スタックとアクション パックに送られ、キャッシュが提供される前にフィルターを実行できるという点が異なります。これにより、キャッシュされたコピーからの出力結果を提供しながら、認証やその他の制限を実行できます。

では、なぜ私の before フィルターが呼び出されないのでしょうか?

私のセットアップについて少し: 認証にDeviseを使用するRails 3.1。memcached ストアに dalli gem を使用しています。

ここに私のコードを要約したいくつかのコードがあります(多くの粗雑な部分が切り取られています):

class GroupsController < ApplicationController
  caches_action :show
  cache_sweeper :group_sweeper

  before_filter :authenticate_user!, :except => [:index]
  before_filter :init_group, :except => [:new, :create, :index]
  before_filter :requires_group_membership, :except => [:new, :create, :index]

  def show
  end

  private

  def requires_group_membership
    if current_user and !@group.users_active.index(current_user).nil?
      return true
    else
      redirect_to :root
      return false
    end
  end

  def init_group
    @group = current_user.active_groups.find_by_id(params[:id])

    if @group.nil?
      redirect_to :root
      return false 
    end
  end

それで、誰かが前にこの行動を見たことがありますか?フィルタとアクション キャッシングがどのように機能するかについて、私の理解に穴がありますか? それとも、宝石バージョンの奇妙な組み合わせで奇妙なブードゥーが起こっているのでしょうか?

[編集]

興味深いことに、戻り値は、チェーンに沿ってさらにメソッドが実行されるかどうかに影響を与えないことを知りました。それは、リダイレクトまたはレンダリングが呼び出されるかどうかです。

[編集2]

アプリを rails 3.2.3 にアップグレードして効果があるかどうかを確認しましたが、問題は解決しませんでした。私が発見したことは、ApplicationController で定義された before フィルターが呼び出されているが、GroupsController のものは呼び出されていないことです。

4

1 に答える 1

27

さて、これはキャッシングについての新しい情報を学ぶのに非常に時間のかかる方法でした。

実行したい before_filters のに caches_action を呼び出す必要があることがわかりました。私はキャッシュ アクションをクラスの最初の項目の 1 つとして配置しました。これは、すべての before フィルターが caches_action の下/後に表示されるため実行されていなかったことを意味し、caches_action はコードの実行を停止します (そしてキャッシュされた結果を提供します)。

この貴重な情報を含む彼の回答について、 Pan Thomakosに感謝します。この小さな死角のために失われた時間を取り戻すことができたら、この情報をドキュメントに追加するよう努めます.

于 2012-05-21T06:27:57.603 に答える