ControllerでModel.findを利用するときの注意点

テストしていて躓いたので記事にしておきます。

よくある実装 ※色々省略してます。

users_controller.rb

def show
     getUser
end

private
  def getUser
      @user = User.find(params[:id])
  end

実際はbeforeで一括しておくのが普通だとは思うんですが今回はこんな感じで。
...で、このままだとURLの改竄をされた場合にエラーが発生する。

なので見つからなかった時の処理を書く。

def show
     return redirect_to :users  if getUser.nil?
end

見つからなかったらnilで判定してusersにリダイレクトする。
ところが これはエラーで落ちる。

原因は Controllerでのfind系メソッドは未存在時にnilを返さないから。
※HTTPステータス404が返る。

なので実際には以下のコードで対応する。

def index
   return redirect_to :users  if getUser.nil?
end

private
def getUser
  begin
    @user = User.find(params[:id])
  rescue
    @user = nil
  end
end

一応今回実装している設計ではエラー時のリダイレクト先が一律ではないので
nilで返してくれたほうが色々と都合がいいということでnilを返すように実装している。