2014-01-24 45 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