Rails の redirect_to でハマった
ハマったのはこんなコードを書いていたから.
def authorize user = User.find_by_id(login_user_id) unless user redirect_to root_path end if not user.registered redirect_to register_users_path end end
よくあるユーザー認証メソッドだと思う. 期待した動作はこう.
まず, user が存在しない場合 nil なので root_path へリダイレクトする.
user が存在しているが, 情報が登録されていない場合, register_user_path へリダイレクトする.
なんだけど, これがうまく思ったように動かず, エラーでコケてばかりいた.
ログを眺めてみたけれど, user が取得できない場合 nil なので registered メソッドの呼び出しに失敗しているようで, 目論見としてはそもそもその前にリダイレクトされるんだから呼び出されるわけないじゃんってとこで, まぁおかげ様で大変悩みました.
解決策は以下の通り, unless で return してやるだけ.
def authorize user = User.find_by_id(login_user_id) unless user return redirect_to root_path end if not user.registered redirect_to register_users_path end end
直感に従えば, redirect_to でメソッドを抜けて欲しいのだけれどそうは問屋が卸さないというわけですね.
たぶんこれはスマートに書き直すならこっちのほうがいいのかな?
def authorize user = User.find_by_id(login_user_id) if not user redirect_to root_path elsif not user.registered redirect_to register_users_path end end
unless user よりは, if not user の方がいいかなーと思ったり思わなかったり.