今日はkaeruspoonのコードをちょっとリファクタリングしました。そこで今さらというかなんというか、初めて例外処理を使ってみました。

    begin
      album = Album.find(params[:id])
    rescue ActiveRecord::RecordNotFound
      redirect_to(unknown_url)
      return
    end

 コントローラ内の処理です。findはデータベースにないidが指定されたとき、RecordNotFound例外を発生させます。rescue節の中でリダイレクトのあとにreturnしているのは、実際にリダイレクトされるのはメソッドが終了したときで、ここでreturnを入れてないと以降の正常処理を走らせてしまうからです。  でも、こんな使いかたでいいのかな? それにただ一行のfindのために例外処理を使うのも大げさな印象がある。find(:conditions)を使えば、レコードが存在しないときはnilが返ってくるのだから、それを見て処理をわければいいだけのような気もする。どちらがいいのでしょう。でもとりあえずぼくは、例外処理でやっていくことにします。

 こうすればいいことに気づいた。

    begin
      album = Album.find(params[:id])
      ……以降、通常処理
    rescue ActiveRecord::RecordNotFound
      redirect_to(unknown_url)
    end

 こっちのほうが従来の使いかたなのかな。begin節内の複数のfindに対応できるし。なんとなく突然、C言語のエラー処理で例外的にgotoを使うやり方を思い出しました。

 create系のDBアクセスも例外処理を入れてみました。今までは何も考えずにcreateメソッドばかり使っていたけど、例外を発生させてやるためにnew→save!もしくはbuild→save!を使うようにしてみました。これで大丈夫なのかな? いろいろと調べてみたのだけど、このあたりの動きがよくわからなかったのです。第8回のRails勉強会@東京に参加したときに、どなたかがこのあたりの話をしていたのだけど、どうだったか忘れてしまいました。このように、常にいろいろ興味を持っていないと、結局いつかは自分が困ることになります。