2014-01-24 20 views
10

Warum würde diese Transaktion Rollback nicht, wenn auch nur eine erstellen! scheitert? Es ist in einem Controller, wenn das einen Unterschied macht.Rails-Transaktion wird nicht zurückgesetzt

def process_photos(photos) 
    ActiveRecord::Base.transaction do 
    begin 
     photos.each do |photo| 
     Photo.create!(creator_user: @user, buyer: @buyer, url: photo['url']) 
     end 
    rescue 
     raise ActiveRecord::Rollback 
    end 
    end 
end 

Ich sende explizit ein Array mit einigen schlechten Aufzeichnungen. Die Guten werden erschaffen und die Schlechten sind nicht, aber ich brauche das Ganze, um Rollbacks zu machen, wenn selbst eines scheitert.

Hier ist meine Rspec Test (Übergabe einer JSON-Array von Fotos) und es erhöht sich.

expect { post :create, json }.not_to change(Photo, :count) 
+0

Etwas scheint falsch mit Ihrem verschachtelten @ kjs3. Insbesondere scheint 'ActiveRecord :: Base.transaction do' kein passendes' end' zu haben. – thomasfedb

+0

Kopieren fehlgeschlagen. Es ist richtig verschachtelt. Fest. – kjs3

+0

Es sieht so aus, als ob es sich um ein rspec-Problem handelt. Die Transaktion scheint zurückzurollen, wenn ich mit curle poste. – kjs3

Antwort

15

Dies war nur ein Testproblem mit rspec, weil Sie bereits eine Transaktion im Test ausführen. Es ist das gleiche geschachtelte Transaktionsproblem, das unter here diskutiert wurde. Um den Test zu bekommen was Sie brauchen, zu arbeiten ...

requires_new: true 

zum Transaktionsaufruf.

Dies hat den Test behoben.

def process_photos(photos) 
    ActiveRecord::Base.transaction(requires_new: true) do 
    begin 
     photos.each do |photo| 
     Photo.create!(creator_user: @user, buyer: @buyer, url: photo['url']) 
     end 
    rescue 
     raise ActiveRecord::Rollback 
    end 
    end 
end 
Verwandte Themen