2012-05-01 31 views
11

Sé que before_filter es solo para controladores en Rails, pero me gustaría algo como esto para un modelo: cada vez que se llame a un método en mi modelo, me gustaría ejecutar un método que determine si el método llamado debería ejecutarse . Conceptualmente, algo como esto:Modelo de rieles "before_filter"?

class Website < ActiveRecord::Base 
    before_filter :confirm_company 

    def confirm_company 
    if self.parent.thing == false? 
     return false 
    end 
    end 

    def method1 
    #do stuff 
    end 

end 

Así que cuando llamo @ website.method1, primero llame confirm_company, y si vuelvo falsa, no se ejecutará metodo1. ¿Rails tiene una funcionalidad como esta? Espero que sólo estoy perdiendo algo obvio aquí ...

+1

¿Quiere decir [Active Record devoluciones de llamada] (http://guides.rubyonrails.org/active_record_validations_callbacks.html#callbacks-overview)? – Mischa

+0

Sí, una devolución de llamada es lo que necesito, supongo. Pero ninguna de las devoluciones de llamada disponibles puede hacer lo que estoy buscando. No estoy guardando, validando, inicializando ... Estoy llamando a un método. –

+0

puede usar un objeto proxy y delegar en el modelo si se cumple su condición – apneadiving

Respuesta

12
class MyModel 
    extend ActiveModel::Callbacks 
    define_model_callbacks :do_stuff 

    before_do_stuff :confirm 

    def do_stuff 
     run_callbacks :do_stuff do 
      #your code 
     end 
    end 

    def confirm 
     #confirm 
    end 
end 

realmente no estoy seguro de que esto va a funcionar, pero se puede probar, ya que realmente no tiene tiempo ahora. Eche un vistazo a eso: http://api.rubyonrails.org/classes/ActiveModel/Callbacks.html

+0

Esto funciona exactamente como usted indicó. Me requiere tocar cada modelo, pero es una solución muy limpia, considerando todo. ¡Muchas gracias! –

+0

Genial :) Quizás puedas pensar en extraer cosas en módulos si tienes patrones recurrentes en tus modelos. Solo un pensamiento. – Robin