Подтвердить что ты не робот

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

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

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

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

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

Немного о моей настройке: 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 [email protected]_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]

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

[edit 2]

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

4b9b3361

Ответ 1

Хорошо, это был очень временный способ узнать новый лакомый кусочек о кешировании.

Оказывается, вы должны сделать вызов caches_action ПОСЛЕ перед_фильтрами, которые вы хотите запустить. У меня было действие кешей как одна из первых вещей в моем классе, поэтому все фильтры перед запуском не выполнялись, поскольку они были ниже.

Спасибо Pan Thomakos за его ответ, в котором содержится этот драгоценный камень информации - который либо не находится в рубиновые документы ИЛИ я просмотрел его. Я хочу, чтобы эта информация была добавлена ​​в документы, как только мне удастся вернуть время, потерянное из-за этого небольшого блайнда.