2009-08-03 11 views
14

decir que tengo un modelo de usuario con el código siguiente en User.rb:¿Los accesorios activan las devoluciones de llamada de los modelos?

before_create :create_dependencies 
after_create :build_inbox 

Y también tengo un archivo users.yml con un montón de accesorios de usuario definidos en el mismo.

Cuando ejecuto rake db: fixtures: load, no parece activar las devoluciones de llamada.

  1. ¿Es así como se espera que funcione? Si es así, ¿por qué lo diseñaron de esta manera?
  2. ¿Hay alguna manera de forzar el disparo de las devoluciones de llamadas al cargar dispositivos?

Respuesta

20

¿Es así como se espera que funcione? Si es entonces, ¿por qué lo diseñaron de esta manera?

Sí, los dispositivos no utilizan devoluciones de llamada. Supongo que esto es por motivos de rendimiento. Es más rápido cargar los datos directamente en la base de datos sin instanciar el modelo.

¿Hay una manera de forzar la activación de las devoluciones de llamada al cargar accesorios?

No es que yo sepa. Usted tiene un par de opciones. Una es construir sus accesorios como si las devoluciones de llamada ya se hubieran activado. Es decir, crea manualmente los datos que las devoluciones de llamada harían. Por ejemplo, si tiene una devolución de llamada que codifica la contraseña de un usuario, deberá modificarla manualmente y luego almacenarla en el dispositivo.

La segunda solución (¡y altamente recomendada!) Es usar fábricas. Las fábricas desencadenan devoluciones de llamada y le permiten usar atributos virtuales, etc. Esto se debe a que crean instancias del modelo cada vez. Una joya popular es Factory Girl. Otro para probar es Machinist. También creé un Railscasts episode sobre el tema.

+0

Perfecto, gracias. – cakeforcerberus

+0

+1 a chica de fábrica. Lo cambié hace 2 meses y nunca miré hacia atrás. –

+0

+1 porque Factory Girl es tan increíble ... tómate la hora para aprenderlo, recuperarás tu tiempo perdido muy rápidamente. – Emerson

4

Tengo este problema también. Nuestra aplicación calcula algunos totales before_save para que no tenga que hacerse sobre la marcha. Hace que los informes sean más rápidos y corta algunas combinaciones en ciertos informes.

En las pruebas para aquellos objetos que ejecutar manualmente las devoluciones de llamada como esta:

before do 
    order.perform_callbacks 
end 

Esto funciona bien porque no se ejecuta todo el tiempo para que otras pruebas no sufran.

Estamos usando minitest y accesorios por cierto.

+0

¿Dónde vive este código? Parte superior del accesorio? ¿Qué es orden? – hellion

+0

Hola hellion. El código vive en la parte superior de mi archivo de prueba en una versión anterior, porque para mí en este caso lo necesito para cada prueba en este archivo. Si solo necesita asegurarse de que las devoluciones de llamada se ejecuten para 1 prueba, puede simplemente poner .perform_callbacks en esa prueba en particular. – jacklin

+0

¿Qué es 'order', una clase, una instancia? Es extraño que no pueda encontrar 'perform_callbacks' documentado en ninguna parte. –

Cuestiones relacionadas