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

Jen*_*sky 12 ruby-on-rails ruby-on-rails-4

什么是处理错误的最佳方法,然后找不到ID?我的控制器中有这个代码:

  def show
    @match = Match.find(params[:id])
  end
Run Code Online (Sandbox Code Playgroud)

我在考虑这样的事情:

  def show
    if @match = Match.find(params[:id])
    else
      render 'error'
    end
  end
Run Code Online (Sandbox Code Playgroud)

但我仍然得到:

MatchesController#show中的ActiveRecord :: RecordNotFound

无法使用'id'= 2找到匹配

为什么?

什么是正确的解决方案?

xda*_*azz 25

在基本控制器中救援它,并使您的操作代码尽可能简单.你不想在每一个动作中都没有找到异常,对吗?

class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, :with => :render_404

  def render_404
    render :template => "errors/error_404", :status => 404
  end
end
Run Code Online (Sandbox Code Playgroud)

  • +1.并且请用甜美可爱的猫制作一个自定义的404页面,做一些随机的东西,同时说404.每个人都喜欢它! (5认同)

Fra*_*ffa 5

默认情况下,该find方法引发ActiveRecord::RecordNotFound异常。处理未找到的记录的正确方法是:

def show
  @match = Match.find(params[:id])
rescue ActiveRecord::RecordNotFound => e
  render 'error'
end
Run Code Online (Sandbox Code Playgroud)

但是,如果您喜欢if / else方法,则可以使用find_by_id将返回nil 的方法:

def show
  @match = Match.find_by_id(params[:id])
  if @match.nil?     # or unless @match
    render 'error'
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 当然,但是我非常喜欢可读代码而不是短代码:D (2认同)