2015-09-30 60 views
3

如何檢查變量在我的控制器中是否有錯誤,然後再查看。如何檢查變量是否有錯誤

在我的控制器:

def index 
    @sample_model = Model.all 
    rescue => e 
    flash.now[:alert] = e.message 
end 

,比如我有錯誤ActiveRecord::StatementInvalid: Mysql2::Error: Table 'models' doesn't exist: ...

我想,如果第一次去觀看,所以我可以證明它在我的閃光燈前檢查。

+0

你用標準方式導軌會出現問題嗎?也就是說,如果您刪除了「rescue」條款,就會出現錯誤?如果是這樣,你想達到什麼目的? – ReggieB

回答

3

我期待着看到一個解決方案(這本身並不是一個答案);我想強調幾點:


I want to check if first before going to view so I can show it my flash.

你怎麼能指望顯示在您的Flash錯誤?

很多時候,這種性質的錯誤導致了相當於fatal exception,阻止應用程序進展。

當這種情況發生時,Rails有一些中間件捕獲異常並將它傳遞給錯誤處理頁面。我會在一分鐘內解釋這一點。

但事實仍然是,如果你要收到一個錯誤 - 你如何期待你的堆棧的其餘部分工作? 也許MYSQL表不存在 - 如果您在佈局中調用相同的數據或什麼?


什麼你要找的是兩件事情之一:

  1. A way to handle specific errors (IE no data)
  2. A way to rescue exceptions in a controlled manner (IE without having the default "exception" page from Rails.

config.exceptions_app

這是不是問題的答案,但它會幫助...

所有Rails異常都由中間件鉤子config.exceptions_app處理:

enter image description here

實際中間件是ActionDispatch::ShowException,由此可以看出here

您所獲得的任何「自定義例外頁面」教程都將基本掛鉤到config.exceptions_app中間件中,可以使用self.routes或控制器調用。

我一直參與custom error pages一段時間; I wrote a gem。有幾點需要理解它。

的Rails調用2套錯誤 - 40x & 50x

  • 40x(如404)是缺少資源
  • 50x(如500)是服務器故障

兩者之間的區別在於404錯誤(無論是否路由或無數據)都不是致命的。 500錯誤致命(因爲它們阻止您的應用程序運行)。

500個錯誤無法通過應用程序的其餘基礎結構獲救;他們可能是來自你的數據庫的任何東西,沒有連接到沒有任何值的變量。


您希望拯救什麼類型的錯誤?

因此,如果它是「無數據」錯誤,您將能夠通過@variable.nil?條件處理該錯誤。

如果是更嚴重的事情(問題進一步發展),您希望發生什麼?你的視圖&佈局會加載沒有數據?如果您的數據庫連接中斷?

-

我能給出的最好的建議是你的控制器&視圖中處理任何應用程序級異常,EG:

#app/views/data/object.html.erb 
<% if @variable.any? %> 

如果你想「美化」你的錯誤頁面,您最好使用here其中一項建議,或者僅使用我幫助編寫的exception_handler寶石。

+1

我認爲這對我所輸入的人來說是一個更好的答案。 – ReggieB

+0

感謝哥們,這意味着很多! –

0

使用此代碼:

@sample_models.select{|sm| sm.errors.present?}.collect(&:errors) 
+0

我試過類似的東西,但沒有運氣。我得到了這個,而不是':0x007f9489dd3608 >>' –

+2

請注意@sample_model是模型對象的集合 - 不是one.The集合沒有錯誤方法。 – ReggieB