2014-01-24 80 views
10

爲什麼這個事務回滾,如果連一個創建!失敗? 這是在一個控制器,如果這有什麼區別。Rails事務沒有回滾

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 

我明確地發送一些數據與一些不良記錄。好的是創造,壞的不是,但我需要整個事情回滾,即使一個失敗。

這是我的rspec測試(傳遞一張json數組照片),它是遞增的。

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

你的嵌套@ kjs3有點不對勁。特別是'ActiveRecord :: Base.transaction do'似乎沒有匹配的'end'。 – thomasfedb

+0

複製失敗。它是嵌套的權利。固定。 – kjs3

+0

看起來這是一個rspec問題。當我用curl發帖時,交易似乎回滾。 – kjs3

回答

15

這只是rspec的測試問題,因爲您已經在測試中的事務中執行了。這是討論here相同的嵌套事務問題。 爲了讓測試工作,你需要添加...

requires_new: true 

的事務調用。

這固定了測試。

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