2011-06-15 13 views
45

Tengo problemas para que los filtros funcionen en una aplicación Rails que actualicé recientemente de 1.9 (?) A 2.3.11. Para probar y depurar, lo he puesto un before_filter en un controlador:before_filter no canceling action

before_filter :false_filter 

y la siguiente en application_controller.rb:

def false_filter 
    puts "false filter running" 
    false 
end 

entonces yo llamo el método de cualquiera de pepino/webrat o un navegador , y mientras se llama al filtro (puedo ver las palabras que envían el mensaje), la cadena de filtros no se termina.

Me pregunto si hay algún código repetitivo que no se haya generado. ¿Alguien puede sugerir dónde mirar?

+9

Probablemente se confunde con el método de registro activo before_xxx que no está guardando el registro cuando devuelve falso –

Respuesta

89

Nada le presta atención al valor de retorno de un filtro anterior. Si desea detener el proceso, lo que tiene que hacer algo de su filtro o redirigir a otro lugar, from the fine guide:

Si un filtro antes de renders o redirecciones, la acción no se ejecutará. Si hay filtros adicionales programados para ejecutarse después de ese filtro, también se cancelan.

El mismo texto aparece en el 2.3.8 guide.

Este comportamiento tiene sentido, si la cadena de filtro no se completa (es decir, deja de filtrarse en el medio), terminaría llamando a los métodos del controlador con cosas que no estaban configuradas de la manera en que esperaban y que solo causaría dolor, sufrimiento y confusión y eso no sería para nada amistoso o divertido.

+5

Los ejemplos que estaba viendo hacen un redireccionamiento y luego devuelven falso, y me aferré a la parte falsa, que resultó ser exacto así. Todo tiene perfecto sentido, gracias. –

+8

@Henry: No me siento mal, encuentro que gran parte de la documentación de Rails y Ruby es un poco escasa en detalles como este. –

+0

@muistooshort Necesito ayuda. Estaba revisando [Patrones de diseño] (http://en.wikipedia.org/wiki/Design_Patterns), y la mayoría de ellos usa 'Interface' que no es el tema de Ruby. Entonces, no puedo entenderlos. ¿Algún consejo sobre cómo aprender eso? No puedo codificarlos en Ruby. Las traducciones de línea por línea no creo que sean una mejor opción. Por favor aconsejame. –