2011-02-20 56 views
47

save bang your head, active record will drive you mad,我們應該避免使用save!rescue成語特殊情況。鑑於此,說模型需要@post.mark_rejected何時在模型中使用`save`和`save!`?

如果mark_rejected代碼失敗由於以下問題之一,應該拋出異常? :

  • ,如果有一個驗證問題
  • 如果非空的字段是被分配一個空
  • ,如果有一個連接丟失數據庫

如果我們不扔一個例外,那麼:

  • 控制器動作將不得不檢查返回值mark_rejected並做它的事
  • 我們不希望從該方法調用的異常,所以我們不寫在控制器動作rescue條款,從而異常堆滿達(..wherever ..),將可能顯示爲一些(500 HTTP ?)錯誤

示例代碼:

def mark_rejected 
    ... 
    save! 
end 

def mark_rejected 
    ... 
    save 
end 
+4

@Zabba這裏是[源代碼和save'的'文檔和'保存!'](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb# L86)。 – JJD

回答

18

有一個異常更多的開銷,所以有性能問題,especi盟友什麼時候可以預計它會經常被拋出,如save

它是檢查返回值是否比救援一個異常更少的代碼行,所以我不明白如果你已經不得不搶救異常是如何檢查返回值的問題。在實踐中,save!拋出的異常多久會冒出多少次泡泡調用堆棧?很少,如果有的話,根據我的經驗。

如果調用save時,而不是save!你應該希望它顯示500錯誤頁面,因爲這是發生了什麼事引發的異常:無法恢復的,未知的,意外的內部服務器錯誤。

+1

謝謝你今天的幫助。 我現在讀了一些關於例外的事情,並得出結論,例外情況不應該用於 「流量控制」。如果有例外情況,我會讓它冒出呼叫堆棧,而是編寫 值檢查代碼來處理問題。目前這種做法似乎是做這些事情的正確方式,儘管我並不完全確定 的原因。好吧。 – Zabba

99

save!如果不成功會引發錯誤。

save將返回像真或假的布爾值。

+0

保存的相反命令是什麼?我的意思是刪除用戶的命令是什麼? – user1903022

+0

'user.delete'和'user。刪除'它會刪除用戶 – Selvamani

+0

@Selvamani:user.remove? – ram

相關問題