ruby-on-rails - 保存失败后 Rails 不回滚事务()

标签 ruby-on-rails ruby postgresql rspec transactions

我有这个领域模型:一个用户有一组项目,项目的状态可能无法通过验证。

验证工作正常,我什至看到在我使用 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/

相关文章:

ruby-on-rails - 将对象作为路径助手的参数传递

javascript - RJS 还是 Javascript?

ruby-on-rails - 如果 Rails asset pipeline 将所有 JS 文件合并为一个来加速下载,这不会损害缓存吗?

ruby-on-rails - 范围为 :module nested routes 的 form_for 路由错误

ruby-on-rails - Rails 4 错误,每个命令 "` load' : no implicit conversion of nil into String"(Mac OS X 10. 9)

postgresql - 在 pl/pgsql 中使用文本会带来空的结果集

ruby-on-rails - 待处理的迁移错误 |无法删除重复迁移

ruby - Ubuntu 上的 Nginx 设置

PostgreSQL - fatal error : Ident authentication failed for user

python - Mac psql/readline - 未加载库