处理错误的最佳方法是什么,然后找不到ID? 我的控制器中有这个代码:
def show
@match = Match.find(params[:id])
end
我在考虑这样的事情:
def show
if @match = Match.find(params[:id])
else
render 'error'
end
end
但我仍然得到:
MatchesController中的ActiveRecord :: RecordNotFound#show
找不到'id'= 2
的匹配
为什么?
什么是正确的解决方案?
答案 0 :(得分:24)
在基本控制器中救援它,并使您的操作代码尽可能简单。 你不想在每个动作中都没有找到异常,是吗?
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordNotFound, :with => :render_404
def render_404
render :template => "errors/error_404", :status => 404
end
end
答案 1 :(得分:4)
默认情况下,find
方法会引发ActiveRecord::RecordNotFound
异常。处理未找到记录的正确方法是:
def show
@match = Match.find(params[:id])
rescue ActiveRecord::RecordNotFound => e
render 'error'
end
但是,如果您更喜欢if / else方法,则可以使用将返回nil的find_by_id
方法:
def show
@match = Match.find_by_id(params[:id])
if @match.nil? # or unless @match
render 'error'
end
end
答案 2 :(得分:1)
您可以使用find_by_id方法返回nil而不是抛出异常
Model.find_by_id
答案 3 :(得分:0)
缺少两种方法:
一个是使用Null-Object(我将研究留给你)
提到了另外一个,但是可以放置得更加可重复使用并且更优雅(但它有点隐藏在你的动作代码中,因为它 在更高的水平上工作并隐藏东西):
class MyScope::MatchController < ApplicationController
before_action :set_match, only: [:show]
def show
# will only render if params[:id] is there and resolves
# to a match that will then be available in @match.
end
private
def set_match
@match = Match.find_by(id: params[:id])
if !@match.present?
# Handle somehow, i.e. with a redirect
redirect_to :back, alert: t('.match_not_found')
end
end
end