Pregunta

Tengo un controlador en el que estoy almacenando en caché la acción del programa. La acción del espectáculo tiene una cantidad de antes de los filtros de seguridad que están destinados a ejecutar y redirigir si el usuario no ha iniciado sesión, no es miembro del grupo actual, etc. Estos antes de que los filtros funcionen perfectamente cuando no he encendido el almacenamiento en caché, pero Cuando levante el interruptor para girar el almacenamiento en caché en los filtros antes de que ya no se ejecuten (las llamadas de mi depurador no se han golpeado).

Siempre ha sido comprensivo de que antes de que se llamen los filtros por acciones en caché, siendo la principal diferencia entre el almacenamiento en caché de la página y el almacenamiento en caché de acción. Esto está respaldado por el Rails Tutorial de almacenamiento en caché Sección en caché de acción que lee:

El almacenamiento en caché de acción funciona como el almacenamiento en caché de la página, excepto por el hecho de que la solicitud web entrante va del servidor web a la pila de rieles y el paquete de acción para que antes de que se puedan ejecutar los filtros antes de que se sirva el caché. Esto permite que la autenticación y otra restricción se ejecuten mientras se sirve el resultado de la salida de una copia en caché.

Entonces, ¿por qué no son mis filtros antes de llamar?

Un poco sobre mi configuración: Rails 3.1 Uso de ideas para la autenticación. Estoy usando la gema Dalli para una tienda Memcached.

Aquí hay algún código que resume mi código (un montón de CRUFT CUT OUT):

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

Entonces, ¿alguien ha visto este comportamiento antes? ¿Tengo un agujero en mi comprensión de cómo antes de que se supone que los filtros y el almacenamiento en caché de acción funcionen? ¿O tal vez tengo algún voodo raro que sucede con un combo raro de versiones de gem?

[editar]

Curiosamente, acabo de enterarme de que el valor de retorno no ha tenido un efecto sobre los métodos o no de los métodos adicionales a lo largo de la cadena, es si se llama a una redirección o render.

[editar 2]

Actualicé mi aplicación a los rieles 3.2.3 para ver si tenía un efecto, pero no solucionó el problema. Algo que he descubierto es que los filtros antes de definidos en la aplicación, se llaman, pero los de My GroupScontroller no lo son.

¿Fue útil?

Solución

Bueno, esta ha sido una forma muy a pesar de aprender un nuevo tidbit sobre el almacenamiento en caché.

Resulta que debe realizar la llamada a Caches_Action después de los antes_filters que desea ejecutar.Había colocado la acción de cachés como una de las primeras cosas de mi clase.Esto significó que todos los filtros antes de que no se ejecutaban, ya que aparecían a continuación / después de la Caches_Action, y Caches_Action detiene la ejecución del código (y sirve el resultado en caché).

gracias a pan thomakos para su respuesta que contenía esta gema de información, que no está en los documentos de Ruby o que he escurrido sobre él.Me envejeceré para que esta información se agregue a los documentos una vez que haya logrado que se le haya perdido el tiempo perdido debido a esta pequeña ciencia ciega.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top