[RUBY] [Rails] Les rappels définis avec des conditions on :: action ne peuvent pas être évités en utilisant skip_callback et set_callback.

Lorsque j'ai essayé d'éviter temporairement le rappel en utilisant skip_callback et set_callback, set_callback ne fonctionnait pas. Enregistrez la situation et la solution de contournement à ce moment-là.

Chose que tu veux faire

Je souhaite ignorer temporairement ce rappel.

before_validation :func, on: :action

Première chose que j'ai faite

Implémenté en utilisant skip_callback et set_callback.

skip_callback(:validation, :before, :func)
------------------------------------------
#Exécuter le traitement
------------------------------------------
set_callback(:validation, :before, :func)

Cependant, après cela, un problème est apparu dans d'autres opérations et la cause a été recherchée.

Que sont skip_callback et set_callback?

skip_callback peut ignorer le rappel configuré. Cependant, une fois exécuté, il restera ignoré tout le temps, vous devez donc utiliser set_callback pour le renvoyer.

Causes d'échec

ʻOn: Parce que: action` n'a pas été réinitialisé.

En d'autres termes, le comportement a changé car les paramètres de rappel ont changé comme indiqué ci-dessous.

#Avant de sauter
before_validation :func, on: :action
#Après avoir sauté
before_validation :func

Faire face

Le premier set_callback ne spécifiait rien à propos de ʻon :: action`.

set_callback(:validation, :before, :func)

Dans set_callback, ʻon: action n'était pas défini et ʻon: action était perdu.

ʻOn :: action` doit être défini, donc s'il est activé, ce paramètre doit également être inclus dans l'argument.

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

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

Cependant, même si j'ai essayé cela, cela ne s'est pas amélioré.

J'ai vérifié la source. https://github.com/rails/rails/blob/070d4afacd3e9721b7e3a4634e4d026b5fa2c32c/activesupport/lib/active_support/callbacks.rb#L674

Il semble difficile de définir ʻon :: action car il n'y a que ʻif, ʻunless et prefend` dans les arguments commentés dans le code source.

En guise de solution finale, j'ai décidé de l'utiliser car il existe une méthode qui évite les rappels et effectue le traitement. 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

Résumé

skip_callback et set_callback sont des méthodes pratiques pour éviter les callbacks, mais si les conditions sont faites en utilisant ʻon` et que vous pouvez éviter tous les callbacks, les callbacks sont utilisés en premier lieu. Pour l'instant, je me demande s'il vaut mieux utiliser une méthode qui peut éviter.

Recommended Posts

[Rails] Les rappels définis avec des conditions on :: action ne peuvent pas être évités en utilisant skip_callback et set_callback.
[Ruby On Rails] Mesures d'urgence lorsque redirect_to action :: show ne peut pas être (ne peut pas être utilisé) dans l'action de création et de destruction