2010-09-12 5 views
2

Dans mon contrôleur, j'ai le code qui ressemble à ce qui suit:Ruby on Rails: comment attraper ActiveRecord :: Rollback?

@mymodel.transaction do 
     for a in arr 
     @mymodel.some_method(a) 
     end 
    end 

dans @ mymodel # some_method je pourrais jeter une exception ActiveRecord::Rollback qui cependant dans la db fait ce qu'il doit faire, je puis simplement obtenir un HTTP 500 et aucun moyen d'intercepter l'exception pour permettre à l'utilisateur de savoir d'une manière élégante ce qui s'est mal passé.

J'ai essayé d'encapsuler @ mymodel.transaction do dans un bloc begin/rescue, mais cela ne le fera pas non plus. Quelle est la meilleure façon d'attraper l'exception afin que je puisse présenter la bonne vue à l'utilisateur?

+0

Le bloc de transaction n'attrape-t-il pas l'exception de restauration? C'est ce qu'il est censé faire ... – Matchu

Répondre

1

De la documentation ActiveRecord::Base:

Normalement, soulevant une exception provoquera la méthode transaction pour annuler la transaction de base de données et passe à l'exception. Mais si vous déclenchez une exception ActiveRecord :: Rollback, la transaction de la base de données sera annulée, sans passer l'exception.

Un petit exemple:

class ThrowController < ApplicationController 
    def index 
     status = ActiveRecord::Base.connection.transaction do 
     raise ActiveRecord::Rollback.new 
     end 

     Rails.logger.info "followed transaction" 
    end 
end 

alors:

>> c = ThrowController.new.index 
=> "followed transaction \n" 

Comme vous pouvez le voir, l'exception ActiveRecord:::Rollback est avalé par le bloc transaction.

Il me semble qu'il se passe quelque chose d'autre avec votre code que nous ne connaissons pas.

+0

Avoir essayé aussi, toujours pas aller, obtenir un http 500 parce que l'exception n'est pas traitée. – randombits

+1

essayez le début de sauvetage en dehors du bloc de transaction –

+0

J'ai retravaillé ma réponse avec un meilleur exemple de la documentation. Je pense que nous avons besoin de plus de code de votre part qui présente l'erreur 500. – rjk