2014-12-08 132 views
8

有下面的代碼:如何正確捕獲控制器操作中的異常?

def index 
    @posts = User.find_by(login: params[:user_id]).posts 
end 

正如你可以看到這個代碼可以生成異常,如果有一些登錄(零指針異常)的用戶。我怎樣才能捕捉到這個異常並正確處理它?我知道如何在Ruby中捕捉異常,但我想知道如何以良好的Rails風格來做。在不同的控制器中可能會出現同樣的問題 - 可能是我應該創建一個動作包裝器,捕獲異常並呈現500錯誤?

+1

您可以使用['rescue_from'(http://edgeapi.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html) – 2014-12-08 09:01:00

+1

好Rails風格不允許異常(至少那一個)被提出。所以你可以使用任何一種形式:'posts = User.where(login:params [:user_id])。first.try(:posts)' – 2014-12-08 09:15:13

+1

集成異常或其他什麼?這應該在BaseController中完成,還是應該將每個操作都包裝在try-catch塊中(rails begin - rescue)? – Miknash 2014-12-08 09:20:36

回答

8

最簡單的方法是使用的ApplicationController的rescue_from

class ApplicationController < ActionController::Base 
    rescue_from ActiveRecord::RecordNotFound, with: :record_not_found 

    private 

    def record_not_found 
    render 'my/custom/template', status: 404 
    end 
end 
相關問題