有下面的代碼:如何正確捕獲控制器操作中的異常?
def index
@posts = User.find_by(login: params[:user_id]).posts
end
正如你可以看到這個代碼可以生成異常,如果有一些登錄(零指針異常)的用戶。我怎樣才能捕捉到這個異常並正確處理它?我知道如何在Ruby中捕捉異常,但我想知道如何以良好的Rails風格來做。在不同的控制器中可能會出現同樣的問題 - 可能是我應該創建一個動作包裝器,捕獲異常並呈現500錯誤?
有下面的代碼:如何正確捕獲控制器操作中的異常?
def index
@posts = User.find_by(login: params[:user_id]).posts
end
正如你可以看到這個代碼可以生成異常,如果有一些登錄(零指針異常)的用戶。我怎樣才能捕捉到這個異常並正確處理它?我知道如何在Ruby中捕捉異常,但我想知道如何以良好的Rails風格來做。在不同的控制器中可能會出現同樣的問題 - 可能是我應該創建一個動作包裝器,捕獲異常並呈現500錯誤?
最簡單的方法是使用的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
def index
@posts = User.find_by!(login: params[:user_id]).posts
rescue ActiveRecord::RecordNotFound => error
# handle user not found case
end
您還可以,如果你想在全球範圍內捕獲錯誤的控制器使用rescue_from
http://edgeapi.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html。
您可以使用['rescue_from'(http://edgeapi.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html) – 2014-12-08 09:01:00
好Rails風格不允許異常(至少那一個)被提出。所以你可以使用任何一種形式:'posts = User.where(login:params [:user_id])。first.try(:posts)' – 2014-12-08 09:15:13
集成異常或其他什麼?這應該在BaseController中完成,還是應該將每個操作都包裝在try-catch塊中(rails begin - rescue)? – Miknash 2014-12-08 09:20:36