Ruby on rails ActiveRecord事务中的错误处理?
我需要在tickets和users表中创建一行。。。我只需要知道如何处理交易失败的情况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的所有人,他们帮助设计师学习了
@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不会重新引发此异常。