我有这个领域模型:一个用户有一组项目,项目的状态可能无法通过验证。
验证工作正常,我什至看到在我使用 save!
时调用了异常。
在我的 Controller 中,我有这个:
@user.items() << item
if @user.save
render :json => {}, :status => :ok
else
render :json => {:status => :error, :errors => item.errors}, :status => :bad_request
end
第一次POST成功了,第二次POST失败了,但是打到索引的时候,还是看到了两个对象,就好像第二次事务没有回滚一样。这是怎么回事?
我的测试是这样的:
post :create
post :create
get :index
ActiveSupport::JSON.decode(response.body).length.should == 1
编辑:即使在运行服务器时,事务也不会回滚 (sqlite3)。
最佳答案
将项目添加到集合中会立即保存它(除非用户未保存)。 对保存的调用创建了自己的事务,这就是回滚的内容,而不是保存项目的事务
您可以通过显式创建一个事务来强制所有内容进入同一事务。
begin
User.transaction do
@user.items << item
@user.save!
render :json => {}, :status => :ok
end
rescue ActiveRecord::RecordInvalid
render :json => {:status => :error, :errors => item.errors}, :status => :bad_request
end
关于ruby-on-rails - 保存失败后 Rails 不回滚事务(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14665269/