2016-07-28 5 views
1

Ich habe eine Methode auf after_save (und es muss nach_save erfolgen, weil ich die ID des Objekts verwenden), aber ich habe ein Kontrollkästchen Attribut zu meinem Formular hinzugefügt, und wenn ich es ändern Wert übergeben natürlich die Callbacks zum Speichern. Aber in der Situation, dass sich nur das Kontrollkästchen geändert hat, möchte ich diese Methode nicht aufrufen ... möchte alle Validierungen/Callbacks bestehen. Ich könnte die Prüfung tun, wenn das object.changes? nur dieses Checkboxattribut hat, aber sobald die Methode after_save ist, habe ich diese Informationen nicht mehr. Kann ich eine check_method before_save machen, und dort etwas tun, um die Rückrufe beim Speichern zu überspringen (wie wäre es)? Oder gibt es einen anderen Vorschlag? Vielen Dank!Rails - bedingte Überspringen Callbacks (after_save)

+0

Ok, wenn Sie also Callback und Validierungen aus bestimmten Gründen überspringen möchten, hat rails einige Methoden dafür. Diese Methoden aktualisieren die Tabelle direkt mit SQL, durchlaufen niemals Callbacks und Validierungen. Schauen Sie die [Liste] (http://guides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks). –

+0

@ArupRakshit aber das Problem ist, dass es auf meinem Formular ist und die Save-Methode aufgerufen werden muss. Aber wenn sich nur dieses Attribut ändert, wollte ich vorher_save überprüfen und dann die anderen Callbacks überspringen –

+0

Ok, dann können Sie wie 'person.name_changed?' Verwenden, wobei 'name' das Attribut des' person' Modells ist. –

Antwort

0

Sie könnten wissen, ob ein Attribut geändert wurde oder geändert wird, indem Sie _changed zum Namen des Attributs hinzufügen.

Option 1

after_save :some_method 

def some_method 
    if email_changed? 
    // do some stuff 
    end 
end 

Option 2

after_save :some_method, if: :email_changed? 

def some_method 
    // do some stuff 
end 
+0

on after_save the attribute_changed? immer falsch zurückgeben. Es funktioniert nur auf vor_save callback –

+0

Ich habe meinen Code in Rails 5 getestet und es funktioniert. –

+0

Ich verwende Rails 3.2.17. Bei after_save Callbacks, Änderungen immer leer zurück ... funktioniert nur bei before_save für mich –

0

In after_save und after_commit Rückrufe Sie previous_changes verwenden können, um die Attribute zu überprüfen, und Kurzschluss, wenn das einzige Attribut geändert aufgeführt ist das Kontrollkästchenattribut.

+0

ausprobiert, aber schau: on before_save, object.changes ist {"desabilita_integracao_sap" => [false, true]} und after_save, object.previous_changes ist {} (leer) Ich benutze Schienen 3. Funktioniert es? –

+0

Habe nicht in Rails 3 versucht, obwohl ich weiß, dass es damals existierte. Versuche es später und melde mich zurück. Welche genaue Version von Rails 3 verwenden Sie? –

+0

ist es Schienen 3.2.17. Ich glaube, es hat diese Methode, denn es hat keinen Fehler ausgelöst, nur einen leeren Hash zurückgegeben ... –