Rails tips: rescue_fromでコントローラのエラーをrescueする(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Rails tips: rescue_fromでコントローラのエラーをrescueする(翻訳)

Ruby on Railsのコントローラで発生したエラーをrescueしなければならなくなることがときどきあります。多くの場合、クエリ実行後データベースにレコードが存在していなければActiveRecord::RecordNotFound例外からのrescueが必要になるでしょう。

サンプルのコントローラを書いてみましょう。

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  rescue ActiveRecord::RecordNotFound => e
    redirect_to :root, alert: 'User not found'
  end

  def edit
    @user = User.find(params[:id])
  rescue ActiveRecord::RecordNotFound => e
    redirect_to :root, alert: 'User not found'
  end
end

このコントローラには2つのメソッドがあり、どちらも同じ例外を同じ方法で扱っています。このコードをもっと再利用するために、ActiveSupportモジュールのrescue_fromメソッドを使う手があります。

class UsersController < ApplicationController
  rescue_from ActiveRecord::RecordNotFound do |exception|
    redirect_to :root, alert: 'User not found'
  end

  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
  end
end

before_actionフィルタを用いてshowメソッドとeditメソッドをリファクタリングすることもできますが、今回は解説しません。さて、上のようにすることでコントローラが読みやすくなり、同じコードを2回も書かなくてよいようになりました。気持ちいいですね!ブロックの代わりにメソッド名を渡すこともできます。

class UsersController < ApplicationController
  rescue_from ActiveRecord::RecordNotFound, with: :redirect_to_homepage

  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
  end

  protected

  def redirect_to_homepage
    redirect_to :root, alert: 'User not found'
  end
end

concernsを使って、1つのメソッドを複数のコントローラで使いまわすことだったできます。この方法が使えるかどうかは、渡された例外をrescueするのに用いるロジック次第です。rescue_fromは、エラー発生時にユーザーに見栄えのよいエページを表示したいときにとても便利です。このメソッドがなければ、しょぼいデフォルトエラーページが表示されることになるでしょう。

RSpec & TDDの電子書籍を無料でダウンロード

もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。

関連記事

Rails tips: スコープを用いてif条件をシンプルにする(翻訳)

Rubyのクラスメソッドがリファクタリングに抵抗する理由(翻訳)

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ