[RUBY] [Rails] Rückrufe, die mit den Bedingungen von on :: action festgelegt wurden, können mit skip_callback und set_callback nicht vermieden werden.

Als ich versuchte, den Rückruf mit skip_callback und set_callback vorübergehend zu vermeiden, funktionierte set_callback nicht. Notieren Sie die Situation und die Problemumgehung zu diesem Zeitpunkt.

Was du machen willst

Ich möchte diesen Rückruf vorübergehend überspringen.

before_validation :func, on: :action

Das erste was ich getan habe

Implementiert mit skip_callback und set_callback.

skip_callback(:validation, :before, :func)
------------------------------------------
#Verarbeitung ausführen
------------------------------------------
set_callback(:validation, :before, :func)

Danach trat jedoch bei anderen Operationen ein Problem auf, und die Ursache wurde untersucht.

Was sind skip_callback und set_callback?

skip_callback kann den konfigurierten Rückruf überspringen. Einmal ausgeführt, bleibt es jedoch die ganze Zeit übersprungen, sodass Sie set_callback verwenden müssen, um es zurückzugeben.

Fehlerursachen

Weil on :: action nicht zurückgesetzt wurde.

Mit anderen Worten, das Verhalten hat sich geändert, da sich die Rückrufeinstellungen wie unten gezeigt geändert haben.

#Vor dem Überspringen
before_validation :func, on: :action
#Nach dem Überspringen
before_validation :func

Bewältigung

Das erste set_callback hat nichts über on :: action angegeben.

set_callback(:validation, :before, :func)

In set_callback wurde on: action nicht gesetzt und die Einstellung on: action ging verloren.

Da Sie "on :: action" setzen müssen, müssen Sie diese Einstellung anscheinend in das Argument einfügen, wenn Sie sie aktivieren.

https://stackoverflow.com/questions/46810340/how-to-set-callback-with-the-on-create-option-in-rails-test

set_callback(:validation, :before, :func, on: :action)

Selbst wenn ich dies versuchte, verbesserte es sich nicht.

Ich habe die Quelle überprüft. https://github.com/rails/rails/blob/070d4afacd3e9721b7e3a4634e4d026b5fa2c32c/activesupport/lib/active_support/callbacks.rb#L674

Es scheint schwierig zu sein, "on :: action" zu setzen, da die im Quellcode kommentierten Argumente nur "if", "es sei denn" und "prepend" enthalten.

Als letzte Problemumgehung habe ich mich für diese Methode entschieden, da es eine Methode gibt, die Rückrufe vermeidet und die Verarbeitung durchführt. https://railsguides.jp/active_record_callbacks.html#%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%82%92%E3%82%B9%E3%82%AD%E3%83%83%E3%83%97%E3%81%99%E3%82%8B

Zusammenfassung

skip_callback und set_callback sind bequeme Methoden, um Rückrufe zu vermeiden. Wenn jedoch Bedingungen mit on hergestellt werden und es in Ordnung ist, alle Rückrufe zu vermeiden, werden in erster Linie Rückrufe verwendet. Im Moment frage ich mich, ob es besser ist, eine Methode zu verwenden, die es vermeiden kann.

Recommended Posts

[Rails] Rückrufe, die mit den Bedingungen von on :: action festgelegt wurden, können mit skip_callback und set_callback nicht vermieden werden.
[Ruby On Rails] Notfallmaßnahmen, wenn redirect_to action :: show nicht zum Erstellen von Aktionen und zum Zerstören von Aktionen verwendet werden kann (kann)