У меня есть контроллер, в котором я кэширую действие 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 - нет.