2010-05-14 10 views
12

En este momento no puedo encontrar una manera de generar una devolución de llamada entre las líneas 1 y 2 aquí:rieles de devolución de llamada para el equivalente de "after_new"

f = Foo.new 
f.some_call 
f.save! 

¿Hay alguna manera de simular lo que sería efectiva una devolución de llamada after_new ? En este momento estoy usando after_initialize pero hay posibles problemas de rendimiento con el uso de eso ya que dispara para una gran cantidad de eventos diferentes.

Respuesta

36

Usted puede usar la devolución de llamada after_initialize

# app/models/foo.rb 
class Foo < ActiveRecord::Base 
    after_initialize :some_call 

    def some_call 
    puts "Who you gonna call?" 
    end 
end 

# rails console 
> foo = Foo.new # => "Who you gonna call?" 
> foo = Foo.first # => "Who you gonna call?" 

Cuidado con after_initialize se activa cada vez que ActiveRecord hacer un Foo.new (llamadas como new, find, first y así sucesivamente) ver la Rails Guide

Así que probablemente quieren algo como esto after_initialize :some_call, :if => :new_record?

# app/models/foo.rb 
class Foo < ActiveRecord::Base 
    after_initialize :some_call, :if => :new_record? 

    def some_call 
    puts "Who you gonna call?" 
    end 
end 

# rails console 
> foo = Foo.new # => "Who you gonna call?" 
> foo = Foo.first 
2

Defina un constructor para Foo y haga lo que necesita hacer allí.

Una solución alternativa sería investigar el uso de after_initialize, pero puede que no sea exactamente lo que espera.

3

Si se trata de un modelo de registro activo, after_initialize es la forma correcta de gestionar las devoluciones de llamada después de la creación del objeto. El propio marco hace ciertas suposiciones sobre la forma en que se crearán los objetos a partir de la base de datos. El rendimiento no debería ser una preocupación a menos que tenga activada una tarea de larga duración en la devolución de llamada, en cuyo caso probablemente deba reconsiderar la estrategia.

Si no es un modelo AR, puede crear un método de inicialización en su objeto y colocar allí el código.

Existen otras devoluciones de llamada disponibles según lo que desee hacer, incluido after_create (llamado cuando se crea un nuevo registro).

+0

Hola, sí, es un registro activo, estoy configurando algunas asociaciones requeridas antes de presentar la vista "nueva". –

Cuestiones relacionadas