70 votes

Rails 3 : validations de saut et callbacks

J'ai un modèle particulièrement complexe avec des validations et des callbacks définis. Les besoins de l'entreprise exigent maintenant un scénario particulier où l'ajout d'un nouvel enregistrement nécessite d'ignorer les validations et les rappels. Quelle est la meilleure façon de procéder ?

118voto

Dinatih Points 1104

Cela fonctionne dans Rails 3 :

Model.skip_callback(:create)
model.save(:validate => false)
Model.set_callback(:create)

( Documents de l'API y Question connexe )

29voto

bowsersenior Points 7841

Utilisez ActiveRecord::Persistence#update_column comme ceci :

Model.update_column(field, value)

2voto

Marcin Raczkowski Points 515

Mon point de vue était le suivant (note : cela désactive les callbacks sur la création, pour la mise à jour, la suppression et autres, vous devez les ajouter au tableau).

    begin
      [:create, :save].each{|a| self.class.skip_callback(a) } # We disable callbacks on save and create

      # create new record here without callbacks, tou can also disable validations with 
      # .save(:validate => false)
    ensure
      [:create, :save].each{|a| self.class.set_callback(a) }  # and we ensure that callbacks are restored
    end

1voto

Caley Woods Points 3601

Que diriez-vous d'ajouter une méthode à votre modèle qui vous permettrait d'éviter les rappels ?

class Foo < ActiveRecord::Base
  after_save :do_stuff

  def super_secret_create(attrs)
    self.skip_callback(:create)
    self.update_attributes(attrs)
    self.save(:validate => false)
    self.set_callback(:create)
  end
end

Si vous finissez par utiliser quelque chose comme ça, je recommanderais d'utiliser self dans la méthode au lieu du nom du modèle pour éviter la connotation du nom.

Je suis aussi tombé sur une idée de Sven Fuchs qui a l'air bien, c'est aquí

1voto

Nathan Points 1542

J'ai écrit une gemme simple pour sauter les validations adhoc, mais elle pourrait probablement être mise à jour pour inclure également le saut des rappels.

https://github.com/npearson72/validation_skipper

Vous pourriez prendre le can_skip_validation_for dans la gemme et ajoute une fonctionnalité pour sauter les callbacks. Peut-être appeler la méthode can_skip_validation_and_callbacks_for

Tout le reste fonctionnerait de la même manière. Si vous voulez de l'aide pour faire ça, faites-le moi savoir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X