Forum: Rails-ES Callbacks personalizados para un observer

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Fernando G. (Guest)
on 2009-03-07 19:30
(Received via mailing list)
Estaba intentando crear un observer que se disparase después de la
llamada a un método de mi modelo..

Pero resulta que los observes sólo pueden activarse antes o después de
los callbacks oficiales:

* http://api.rubyonrails.org/classes/ActiveRecord/Ca...

Y no antes o después de cualquier método mio, como
'Carrito.marcar_como_pagado'

Mi pregunta es si esto es así o hay alguna aproximación oficial para
que mi observer se active con un método como este:

* def after_marcar_como_pagado

He encontrado un parche muy ingenioso que resuelve mi
petición
*
http://alexkira.blogspot.com/2008/10/custom-observ...

Pero me preguntaba si había algo oficial.. porque, desde mi punto de
vista es bastante útil.. :/

f.
Daniel R. Troitiño (Guest)
on 2009-03-07 21:21
(Received via mailing list)
2009/3/7 Fernando G. <removed_email_address@domain.invalid>:
> Mi pregunta es si esto es así o hay alguna aproximación oficial para
>
> f.
>

Recordaba algo de que habían limpiado lo de los callbacks, creo que es
lo que buscas:

<http://apidock.com/rails/ActiveSupport/Callbacks>

Suerte.
Fernando G. (Guest)
on 2009-03-07 21:48
(Received via mailing list)
Hola Dani

El día 7 de marzo de 2009 20:20, Daniel R.
Troitiño<removed_email_address@domain.invalid>
escribió:> 2009/3/7 Fernando G. <removed_email_address@domain.invalid>:
>
> Recordaba algo de que habían limpiado lo de los callbacks, creo que es
> lo que buscas:
>
> <http://apidock.com/rails/ActiveSupport/Callbacks>

No veo en ese ejemplo que usen callbacks customizados, todos los que
salen son con el save: before/after

Hablan de herencia y tal.. pero no de crear callbacks a medida.

Yo lo que quiero es que si tengo este método:

def marcar_como_pagada
 wadus wadus
end

Pueda definir callbacks tal que
así:
after_marcar_como_pagada :do_something
before_marcar_como_pagada :do_otherthing

Y que así mismo pueda poner triggers en un observer antes y después de
cualquier método.

f.
Daniel R. Troitiño (Guest)
on 2009-03-07 23:55
(Received via mailing list)
2009/3/7 Fernando G. <removed_email_address@domain.invalid>:
>
>
> Pueda definir callbacks tal que así:
>
> after_marcar_como_pagada :do_something
> before_marcar_como_pagada :do_otherthing
>
> Y que así mismo pueda poner triggers en un observer antes y después de
> cualquier método.
>

Fijate bien en el método save suyo. Quizá el ejemplo es un poquillo
malo, pero creo que se puede.

Lo que tienes que hacer es más o menos esto (con tus nombres):

class MiClase
  include ActiveSupport::Callbacks

  define_callbacks :after_marcar_como_pagada,
:before_marcar_como_pagada # o los nombres que tu quieras, realmente

  before_marcar_como_pagada :do_something
  after_marcar_como_pagada :do_something_else

  def marcar_como_pagada
    run_callbacks(:before_marcar_como_pagada)
    # tú código real de marcar_como_pagada
    run_callbacks(:after_marcar_como_pagada)
  end

private
  def do_something
  end

  def do_something_else
  end
end

Si bien es cierto que no te dan la funcionalidad de invocar a los
callbacks automáticamente, no está del todo mal. Y juraría que te
funcionará desde un observador.

Suerte.
javier ramirez (Guest)
on 2009-03-08 02:48
(Received via mailing list)
> los callbacks oficiales:
>
>
> Y no antes o después de cualquier método mio, como 'Carrito.marcar_como_pagado'
>

mírate http://www.ruby-doc.org/core/files/lib/observer_rb.html

es parte del api estándar de ruby y es como están implementados los
observers de rails

suerte,

j

--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
..you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez
This topic is locked and can not be replied to.