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
奥が深い。