(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

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 の方がいいかなーと思ったり思わなかったり.