2012-05-01 22 views
11

So che before_filter è solo per i controller in Rails, ma vorrei qualcosa del genere per un modello: ogni volta che viene chiamato un metodo nel mio modello, mi piacerebbe eseguire un metodo che determina se il metodo chiamato deve essere eseguito . Concettualmente, qualcosa di simile:Modello di rotaie "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 

Così, quando io chiamo @ website.method1, in primo luogo chiamare confirm_company, e se torno falso, non verrà eseguito Method1. Rails ha funzionalità come questa? Spero che sto solo perdendo qualcosa di ovvio qui ...

+1

Vuoi dire [Attivo Record callback] (http://guides.rubyonrails.org/active_record_validations_callbacks.html#callbacks-overview)? – Mischa

+0

Sì, una richiamata è ciò di cui ho bisogno, immagino. Ma nessuno dei callback disponibili può fare ciò che sto cercando. Non sto salvando, convalidando, inizializzando ... Sto chiamando un metodo. –

+0

potresti utilizzare un oggetto proxy e delegare al modello se le tue condizioni sono soddisfatte – apneadiving

risposta

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 

Sono davvero non sono sicuro che questo lavoro, ma si può provare, come ho davvero non hanno tempo. Date un'occhiata a: http://api.rubyonrails.org/classes/ActiveModel/Callbacks.html

+0

Esegue esattamente come hai dichiarato. Mi richiede di toccare ogni modello, ma è una soluzione molto pulita, tutto considerato. Grazie mille! –

+0

Cool :) Si può forse pensare di estrarre materiale nei moduli se si hanno schemi ricorrenti tra i modelli. Solo un pensiero. – Robin

Problemi correlati