2017-05-29 47 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時不會運行驗證。「 –