2015-08-21 65 views
0

我正在嘗試創建自己的StandardError異常,但似乎無法通過提升來解除rescue_from。錯誤提出,但從未獲救。我建了一個簡單的應用程序來試試吧,如下:爲什麼這個提升沒有解救,什麼會糾正它,以便它?

class ApplicationController < ActionController::Base 

    protect_from_forgery with: :exception 

    class ApplicationController::LocationInvalid < StandardError 
    end 

    rescue_from ApplicationController::LocationInvalid, with: :reset_it 

    raise ApplicationController::LocationInvalid 

    private 

    def reset_it(exception) 
    session.clear 
    cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery? 
    puts 'Reset it processed' 
    end 
end 

當我包裹籌集開始/救援/結束,它打印ē作爲的ApplicationController :: LocationInvalid:

begin 
    raise ApplicationController::LocationInvalid 
    rescue => e 
    puts e 
    end 

輸出:

入門使用 「/」 爲127.0.0.1,在2015年8月21日15時19分32秒-0400 的ApplicationController :: LocationInvalid

僅在process_action呼叫我已經試過各種形式指定的ApplicationController類,而不是在結果沒有改變的......

+0

嘗試'提升ApplicationController :: LocationInvalid.new'。 – CWitty

+0

@CWitty謝謝你的建議。看起來很合理。但結果基本相同。我看到一個提示:「你可以提出任何事情」,看起來你可以提出一個課程或一個實例。 Rescue_from似乎並沒有分享那種隨便的態度...... –

+0

我不知道在評估課程的時候你是否引發了異常,而且對於'reset_it'的def還沒有被評估呢?嘗試在方法中放置'raise',然後從控制檯或其他東西調用該方法。像Daiku說的 – Daiku

回答

1

根據Rails的https://github.com/rails/rails/blob/f62fb985b6a7b90872148f0786219c9cc94c9356/actionpack/lib/action_controller/metal/rescue.rb#L32

rescue_with作品的源代碼,但你正在募集課堂評估中的例外。如何測試它最簡單的方法可能是創建一個簡單的控制器並採取一些行動,並在該行動期間嘗試引發異常,並且rescue_with應該可以工作。

+0

非常好。我使用after_action來執行拋出錯誤和rescue_from的方法。這有助於我理解我的其他問題,例如爲什麼請求僅在一種方法中可用。似乎是相同的原因。謝謝... –