I and Yuru went to the Doutor which is coffee shop eating Zuwaigani bagels.
今日は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勉強会@東京に参加したときに、どなたかがこのあたりの話をしていたのだけど、どうだったか忘れてしまいました。このように、常にいろいろ興味を持っていないと、結局いつかは自分が困ることになります。