Ruby on rails ActiveRecord事务中的错误处理?

Ruby on rails ActiveRecord事务中的错误处理?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我需要在tickets和users表中创建一行。。。我只需要知道如何处理交易失败的情况 @ticket.transaction do @ticket.save! @user.save! end #if (transaction succeeded) #..... #else (transaction failed) #...... #end 顺便说一句,我想感谢参加stack overflow的所有人,他们帮助设计师学习了

我需要在tickets和users表中创建一行。。。我只需要知道如何处理交易失败的情况

@ticket.transaction do
    @ticket.save!
    @user.save!
end
    #if (transaction succeeded)
        #.....
    #else (transaction failed)
        #......
    #end

顺便说一句,我想感谢参加stack overflow的所有人,他们帮助设计师学习了更多编程知识。。。我感谢你们抽出时间回答n00b这样的问题:)

我也是一个初学者,但我相信你们可以检查@ticket.errors和@user.errors,并根据他们的回答进行验证


save方法还应返回一个布尔值,该布尔值确定保存是否成功

如果您正在使用save!方法时,应用程序将在保存失败时引发异常。然后,您必须捕获异常以处理失败

begin
  @ticket.transaction do
    @ticket.save!
    @user.save!
  end
  #handle success here
rescue ActiveRecord::RecordInvalid => invalid
   #handle failure here
end

非常感谢Matt,我很感激:)像第一个代码片段中的事务(没有抛出异常),根本不是Rails事务。类似于第二个代码段中的事务应该援救所有异常(援救=>e),处理失败,并可能再次引发相同的异常。抱歉,Ando,但它显然是一个ActiveRecord事务,方法“transaction”证明了这一点。事务的要点是,如果第二个操作失败,第一个操作(保存票据)将回滚。对于一个新开发人员来说,这是一个非常基本的例子……显然,可以用失败处理来替换注释。感谢分享您对错误处理的看法,但是这个例子来自Rails的第一作者所写的“使用Rails进行敏捷Web开发”!所以我会对你描述的不抛出异常的东西表示异议Rails@MattMcKnight安藤说得有道理。您的第一个代码段不正确,因为Rails不会回滚对数据库的更改。只有当事务中的代码引发异常时,才会启动回滚。返回false不会回滚数据库。因此,事务中的
@record.save
显然是错误的。这里要添加的一点是,您可以在事务中引发
ActiveRecord::Rollback
,以强制回滚。Railse不会重新引发此异常。