Вопрос

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

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

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

Так почему же не мой до того, как вызов фильтров?

немного о моей установке: Rails 3.1 Использование разработки для аутентификации. Я использую Dalli Gem для магазина MEMCACHED.

Вот какой-то код, который суммирует мой код (много CRUFT вырезается):

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
.

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

[править]

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

[править 2]

Я обновил свое приложение к Rails 3.2.3, чтобы посмотреть, был ли он эффект, но не решил проблему. То, что я обнаружил, что то, прежде чем фильтры, определенные в ApplicationController, вызываются, но те, которые в моем GroupScontroller нет.

Это было полезно?

Решение

Ну это был очень временной способ изучения нового тидбита о кэшировании.

Оказывается, что вам нужно сделать звонок для caches_action после from_filters, которые вы хотите запустить.Я поместил каши в качестве одной из первых вещей в моем классе.Это означало, что все ранее фильтры не проходили, когда они появлялись ниже / после Cache_action, и Caches_action останавливает работу кода (и служит кэшированным результатом).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top