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, не являются.
Ответы
Ответ 1
Хорошо, это был очень временный способ узнать новый лакомый кусочек о кешировании.
Оказывается, вы должны сделать вызов caches_action ПОСЛЕ перед_фильтрами, которые вы хотите запустить. У меня было действие кешей как одна из первых вещей в моем классе, поэтому все фильтры перед запуском не выполнялись, поскольку они были ниже.
Спасибо Pan Thomakos за его ответ, в котором содержится этот драгоценный камень информации - который либо не находится в рубиновые документы ИЛИ я просмотрел его. Я хочу, чтобы эта информация была добавлена в документы, как только мне удастся вернуть время, потерянное из-за этого небольшого блайнда.