2017-05-29 48 views
0

救援/加薪条款存在我有一个简单的异常处理程序如下为什么是事务回滚,如果它在Rails的

begin 
    # code 
rescue Exception 
    # Write to database 
    raise 
end 

write to database回滚如果raise被调用。我正在尝试做什么?

编辑

写入数据库执行以下操作

Question.create(
    notification_id: 1, 
    text: 'test' 
) 

很简单。

+0

它可能不应该......救援块里面有什么? –

+0

尝试从控制台'Question.create!(notification_id:1,text:'test')创建它'注意'!'(砰)它会给你回滚的原因..大多有验证错误。 –

+0

我想我知道问题是什么。如果我错了,请告诉我。 'begin'和'recsue'之间的任何内容都将被回滚。我在救援中呼叫'raise'。 Rail会自行处理异常,当它发生时,我的整个异常存在于rails提供的'begin'和'rescue'块之间。因此Rails将我的写回滚到数据库是有道理的。 – RamJet

回答

0

不能回滚,除非你使用一个交易如下​​喜欢

raise ActiveRecord::Rollback, "Call tech support!" 

在你的情况,可能是你已经验证了模型(问题)的属性和它得到失败。 你可以检查错误,如:

questions=Questions.new(...) 
errors = questions.errors.full_messages if questions.invalid? 
+0

“新”对象如何具有“错误”对象?你有没有试图在你的游戏机上运行它? –

+0

是的。它的确如此。如果我们有任何问题,它会给我们验证错误。如果由于验证记录没有被保存在数据库中,那么我们可以通过使用'questions.errors'来获取验证错误。请按照链接详细解释:http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html –

+0

感谢您的参考,我希望你已经读过它。让我引用第2.4节中的注释'请注意,使用new实例化的对象即使在技术上无效也不会报告错误,因为使用new时不会运行验证。“ –