ActiveRecord の find(id) と find_by_id(id) の違い

両方とも id を指定してレコードを探すことに違いはないが、レコードが見つからなかった場合の挙動に差がある。

レコードが見つからなかったとき
find(id) 例外が発生する
find_by_id(id) nil が返る

find(id) に find_by_id(id) の挙動を期待していたので以下のようなコードを書いてしまっていた。

@item = Item.find(params[:id]) if params[:id]
render(:nothing => true, :status => '404 Not Found') unless @item

これだとレコードが見つからなかったときにサーバーエラー(ステータスコード 500)になってしまう。
そうならないためには以下のコードが正しい。

@item = Item.find_by_id(params[:id]) if params[:id]
render(:nothing => true, :status => '404 Not Found') unless @item

奥が深い。

参考

ActiveRecord のお勉強 – Rails で行こう! – Ruby on Rails を学ぶ

次の記事

RSpec楽しいなぁ