找不到ID时如何处理错误?

时间:2015-09-01 09:31:08

标签: ruby-on-rails ruby-on-rails-4

处理错误的最佳方法是什么,然后找不到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

的匹配

为什么?

什么是正确的解决方案?

4 个答案:

答案 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