Rails caches_action пропускает before_filters

У меня есть контроллер, в котором я кэширую действие show. В действии show есть ряд предварительных фильтров для обеспечения безопасности, которые предназначены для выполнения и перенаправления, если пользователь не вошел в систему, не является членом текущей группы и т. д. Эти предварительные фильтры работают отлично, когда я не включил кэширование, но когда я переключаю переключатель, чтобы включить кэширование, фильтры до того, как они больше не выполняются (мои вызовы отладчика не выполняются).

Я всегда понимал, что перед вызовом фильтров для кэшированных действий, это основное различие между кэшированием страниц и кэшированием действий. Это подтверждается разделом Rails Caching Tutorial по кэшированию действий, который гласит:

Кэширование действий работает так же, как и кэширование страниц, за исключением того факта, что входящий веб-запрос идет с веб-сервера в стек Rails и Пакет действий, чтобы перед обработкой кеша можно было запускать перед фильтрами. Это позволяет выполнять аутентификацию и другие ограничения, продолжая обслуживать результат вывода из кэшированной копии.

Так почему же мои фильтры до не вызываются?

Немного о моей настройке: Rails 3.1 использует Devise для аутентификации. Я использую драгоценный камень dalli для магазина memcached.

Вот код, который обобщает мой код (много лишнего вырезано):

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

Итак, кто-нибудь видел такое поведение раньше? Есть ли у меня дыра в понимании того, как должны работать предварительные фильтры и кэширование действий? Или, возможно, у меня происходит какое-то странное вуду со странной комбинацией версий драгоценных камней?

[EDIT]

Интересно, что я только что узнал, что возвращаемое значение не влияет на то, выполняются ли методы дальше по цепочке, а вызывается ли перенаправление или рендеринг.

[править 2]

Я обновил свое приложение до версии rails 3.2.3, чтобы посмотреть, повлияет ли это, но проблема не устранена. Что-то, что я обнаружил, это то, что фильтры до, определенные в ApplicationController, вызываются, а фильтры в моем GroupsController - нет.

12
задан James P McGrath 21 May 2012 в 06:04
поделиться