Try   HackMD

Rails 處理 ActiveRecord::RecordNotFound

發生情況

當我們試圖查找一條不存在的記錄時,會產生 ActiveRecord::RecordNotFound 例外。
這種情況通常發生在我們嘗試使用 find 方法根據 id 查找記錄時,而該id對應的記錄不存在。

@發生問題點 使用 begin / rescue

為了處理 ActiveRecord::RecordNotFound 例外,我們可以使用 begin/rescue 捕獲該例外,並在捕獲到例外時執行一些操作(例如顯示一個錯誤消息、重定向到另一個頁面)

def find_burger begin @burger = Burger.find(params[:id]) rescue # 查不到資料、發生例外訊息,就會進行 rescue 路線 redirect_to burgers_path, notice: "查無此漢堡" end end # 簡化寫法: def find_burger @burger = Burger.find(params[:id]) rescue redirect_to burgers_path, notice: "查無此漢堡" end

@Controller 層級 使用 rescue_from

也可以在 ApplicationController 上使用 rescue_from 方法來捕捉 ActiveRecord::RecordNotFound 等例外訊息,以在整個應用程序中處理這些例外。

class ApplicationController < ActionController::Base rescue_from ActiveRecord::RecordNotFound, with: :record_not_found # 發生這個例外時調用 record_not_found 方法 private def record_not_found render plain: "404 Not Found", status: 404 # 設定 HTTP 狀態為 404 end end

通過在 ApplicationController 上使用 rescue_from 方法,我們可以避免在每個 Controller 中重複處理相同的例外訊息!