3 votes

La transaction ActiveRecord ne revient pas en arrière

Je suis novice en matière de transactions ActiveRecord. Dans le code ci-dessous, le premier update_attributes provoque un WARNING : Can't mass-assign protected attributes : account_type_cdx et c'est ok. Mais j'ai été surpris que la ligne suivante self.update_attributes !(:purchased => true) soit exécutée et stockée dans la base de données. Je m'attendais à ce qu'il y ait un ROLLBACK parce que la première ligne a échoué.

Il doit me manquer quelque chose... Des indices ?

def complete_purchase(current_user_id, plan_name)
    Rails.logger.debug "COMPLETE PURCHASE"
    user = User.find(current_user_id)
    ActiveRecord::Base.transaction do
        user.update_attributes!(:account_type_cdx => plan_name.to_sym)
        self.update_attributes!(:purchased => true)
    end
end

J'ai suivi les conseils de cet article : http://markdaggett.com/blog/2011/12/01/transactions-in-rails/

Gracias.

2voto

tamersalama Points 1915

Rails ignore les enregistrements qui ne sont pas explicitement énumérés dans attr_accessible (d'où le premier avertissement de mise à jour). Il n'y a pas d'échec de transaction, c'est pourquoi vous atteignez (et terminez) le second update_attributes ! normalement.

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