Ci può spiegare in dettaglio ciò che l' :before_savee :before_createRuby on Rails callback sono, e che cosa hanno a che fare con Rails convalide? La convalida si verifica dopo :before_saveo :before_create?
Ci può spiegare in dettaglio ciò che l' :before_savee :before_createRuby on Rails callback sono, e che cosa hanno a che fare con Rails convalide? La convalida si verifica dopo :before_saveo :before_create?
Risposte:
In un'operazione di creazione in Rails, ci sono sei callback prima dell'operazione del database e due dopo. In ordine, questi sono:
before_validationbefore_validation_on_createafter_validationafter_validation_on_createbefore_savebefore_create
after_createafter_saveLe operazioni di aggiornamento hanno esattamente lo stesso set, tranne leggere updateinvece che createovunque (e AGGIORNARE anziché INSERT ).
Da questo, è possibile vedere che la convalida viene eseguita prima dei callback before_savee before_create.
Si before_saveverifica leggermente prima del before_create. Per quanto ne so, non accade nulla tra loro; ma si before_saveattiverà anche sulle operazioni di aggiornamento, mentre si before_createattiverà solo sulle creature.
after_saveo after_create?
after_saveo after_createcallback, selfè il record che è stato appena salvato, come esiste dopo il salvataggio. Che i campi generati automaticamente comprende piace id, created_at, updated_at.
before_createriferisce al salvataggio di un nuovo oggetto nel database, non al createmetodo effettivo chiamato. Pertanto, before_createpuò ancora essere attivato anche dal savemetodo.
before_save3o e il before_create5o.
before_saveviene chiamato ogni volta che un oggetto viene salvato. Quindi per oggetti nuovi ed esistenti. (crea e aggiorna azione)
before_createsolo prima della creazione. Quindi solo per nuovi oggetti (crea azione)
before_create vs before_save :on => :create
A volte devi stare attento all'ordine dei callback
Vedi qui per maggiori dettagli:
http://pivotallabs.com/activerecord-callbacks-autosave-before-this-and-that-etc/
before_save :on => :createnon funziona (almeno su binari 3.2)
before_save :generate_api_key, :if => :new_record?
before_validation_on_createeafter_validation_on_createvengono rimossi da Rails 3 , invece usabefore_validationeafter_validationrispettivamente con opzione:on => :create.