たとえば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エラーがココを通ってしまうので、どうなんだろう。。