2010-12-08 9 views
12

¿Cómo se puede hacer cumplir una orden de devolución de llamada? Por ejemplo, ¿cómo asegurarse de que Step 1 sucede antes Step 2:Aplicar una orden a las devoluciones de llamadas de los carriles

after_save do 
    logger.info "Step 1" 
end 

after_save do 
    logger.info "Step 2" 
end 

Mi ejemplo real se relaciona con el uso de gemas de terceros y asegurar que se han completado (trabajan en las devoluciones de llamada) ante mis propios devoluciones de llamada. Debo usar la misma devolución de llamada (es decir, no puedo usar una combinación de before y after).

Gracias!

Respuesta

17

Si utiliza devoluciones de llamada de nivel de clase, se invocan en el orden en que se definen.

class Foo < ActiveRecord::Base 

    after_save :step1 
    after_save :step2 

private 

    def step1 
    # stuff 
    end 

    def step2 
    # stuff 
    end 
end 

Para la gema de terceros, que depende de la forma de interactuar con la gema, pero las probabilidades son ellos serán llamados en primer lugar porque se cargaron inicialmente.

No recomendaría utilizar el estilo def after_save en absoluto, especialmente cuando se trata de una gema de un tercero.

+0

El 'def after_save' era un error tipográfico (he actualizado el ejemplo). La gema no se llama primero (es muy similar a 'paperclip', y estoy definiendo' has_attached_file' sobre mi devolución de llamada personalizada). ¿Alguna otra idea sobre hacer cumplir una orden? –

+0

Después de bifurcar la gema, pude arreglar el pedido. ¡Tienes razón en que el orden de definición es lo único que importa! ¡Gracias! –

Cuestiones relacionadas