2011-04-19 19 views

Respuesta

78

Si se refiere http://api.rubyonrails.org/v2.3.8/classes/ActionController/Filters/ClassMethods.html, existe una subpartida llamado "Orden de cadena de filtro", aquí está el código de ejemplo de eso:

class ShoppingController < ActionController::Base 
    before_filter :verify_open_shop 

class CheckoutController < ShoppingController 
    prepend_before_filter :ensure_items_in_cart, :ensure_items_in_stock 

De acuerdo con la explicación:

La cadena de filtros para la CheckoutController es ahora :ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop.

lo que puede dar de forma explícita el orden de la cadena de filtros de esa .

+0

Exactamente lo que estaba buscando .. @Johnny Eres una vida más segura. Muchas gracias. – Surya

+0

@Sector y JohnnyWoo: Tus enlaces a http://rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html han desaparecido. – Kevin

+1

En los rieles 3.2.14, la cadena de filtros que obtengo es la siguiente:: ensure_items_in_stock,: ensure_items_in_cart,: verify_open_shop – Raf

2

por lo que puedo ver, pones la primera función que deseas ejecutar y demás.

Por lo tanto, algo así como:

before_filter :fn1, :fn2 

def fn1 
    puts 'foo' 
end 

def fn2 
    puts 'bar' 
end 

ejecutaría fn1, a continuación, fn2.

Espero que ayude.

+0

estoy usando los carriles 4 y aun cuando mi orden es ': na1,: na2 ',: fn2 se llama primero. – Reboot

23

before_filter Orden en los carriles http://b2.broom9.com/?p=806

cadena de filtros ordenar http://rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html

Si necesita garantizar el orden, es posible hacer esto:

before_filter :fn3 

def fn3 
    fn1 
    fn2 
end 
+3

¿Eso no causará problemas si ambos fallan e intenta redireccionar? – Groxx

+0

Puede usar if en fn3 con check return result de fn1, fn2 – Sector

+0

Si fn1 falla (es decir, devuelve false) y no necesita ejecutar fn2, debe agregar un poco más de lógica. Algo como: 'fn1? fn2: false' –

1

La cadena de filtros para la CheckoutController no se sigue este orden

:ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop 

el contrario, debe ser

:ensure_items_in_stock, :ensure_items_in_cart, :verify_open_shop 
Cuestiones relacionadas