Ruby on Rail 3.2.0 + cancanで意図しないActiveRecord::RecordNotFoundが起こる件

たとえばpeople_controllerのshowで

def show
@person = Person.find(params[:id])
respond_to do |format|
format.html
end
rescue ActiveRecord::RecordNotFound
back_to_index
end

とか書いてあるとき、対象IDのPersonが見つからなければrescue文を通るはず。

RSpecのテストでも
Person.should_receive(:find).and_raise(ActiveRecord::RecordNotFound)
のように書いて試したらきちんとrescue文を通りました。

一安心したところ実際にブラウザで試してみると画面に ActiveRecord::RecordNotFound例外が表示されます。

??なぜ

ログを見るとcancanがそれ以前にfindメソッドを呼んでる。どうやらココで例外が起こってしまっているようです。

当然といえば当然の結果。こちらによると作者は404エラーを起こすべきと考えているようです。正しいように思います。
どうしても修正するにはプラグインの挙動をいじらないと。。

プラグインの中で起こるエラーについて捕捉するにはapplication_controller.rbの中でrescue_fromを書くのがよいけれど、

rescue_from(ActiveRecord::RecordNotFound) {
#処理
}

これだとすべてActiveRecord::RecordNotFoundエラーがココを通ってしまうので、どうなんだろう。。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です