このとき、既にログイン済みのユーザーを対象としているため、ログインページではなくルートURLにリダイレクトしている点に注意してください。10.25ではeditとupdateの各アクションから、@userへの代入文を削除している点にも注意してください。greenになるはずです。test最後に、リファクタリングではありますが、一般的な慣習に倣ってcurrent_user?という論理値を返すメソッドを実装します。分かりやすいコードになります。10.28になります。フレンドリーフォワーディングここまででWebサイトの認可機能は完成したかのように見えますが、後1つ小さなキズがあります。保護されたページにアクセスしようとすると、問答無用で自分のプロフィールページに移動させられてしまいます。別の言い方をすれば、ログインしていないユーザーが編集ページにアクセスしようとしていたなら、ユーザーがログインした後にはその編集ページにリダイレクトされるようにするのが望ましい動作です。リダイレクト先は、ユーザーが開こうとしていたページにしてあげるのが親切というものです。実際のコードは少し複雑ですが、フレンドリーフォワーディングのテストは非常にシンプルに書くことができます。編集ページにリダイレクトされているかどうかをチェックするといったテストです。10.29では該当するテストを削除しています。endend失敗するテストが書けたので、ようやくフレンドリーフォワーディングを実装する準備ができました5。ユーザーを希望のページに転送するには、リクエスト時点のページをどこかに保存しておき、その場所にリダイレクトさせる必要があります。この動作をstore_locationとredirect_back_orの2つのメソッドを使って実現してみましょう。endend転送先のURLを保存する仕組みは、8.2.1でユーザーをログインさせたときと同じで、session変数を使います。(request.original_urlでリクエスト先が取得できます)。リクエストが送られたURLをsession変数の:forwarding_urlキーに格納しています。GETリクエストが送られたときだけ格納するようにしておきます。これによって、例えばログインしていないユーザーがフォームを使って送信した場合、転送先のURLを保存させないようにできます。これは稀なケースですが起こり得ます。ユーザがセッション用のcookieを手動で削除してフォームから送信するケースなどです。GETリクエストが送られてしまい、場合によってはエラーが発生します。request.get?という条件文を使ってこのケースに対応しています6。endendフォワーディング自体を実装するには、redirect_back_orメソッドを使います。リクエストされたURLが存在する場合はそこにリダイレクトし、ない場合は何らかのデフォルトのURLにリダイレクトします。redirect_back_orメソッドでは、次のようにor演算子||を使います。defaultこのコードは、値がnilでなければsession[:forwarding_url]を評価し、そうでなければデフォルトのURLを使っています。いう行を通して転送用のURLを削除している点にも注意してください。(このコードのテストは10.2.3.1の演習に回します)。ちなみに、転送用のURLを削除する動作はredirect文の後に置かれていても実行されるという点を覚えておくとよいでしょう。実は、明示的にreturn文やメソッド内の最終行が呼び出されない限り、リダイレクトは発生しません。したがって、redirect文の後にあるコードでも、そのコードは実行されるのです。10.29のフレンドリーフォワーディング用統合テストはパスするはずです。成功すれば、基本ユーザー認証機能とページ保護機能の実装は完了です。なることを確認してから先に進みましょう。test演習フレンドリーフォワーディングで、渡されたURLに初回のみ転送されていることを、テストを書いて確認してみましょう。戻っている必要があります。10.29のsession[:forwarding_url]が正しい値かどうか確認するテストを追加してみましょう。7.1.3で紹介したdebuggerメソッドをSessionsコントローラのnewアクションに置いてみましょう。(デバッガーが途中で処理を止めるはずです)。ここでコンソールに移り、session[:forwarding_url]の値が正しいかどうか確認してみましょう。(デバッガーを使っていると、ときどき予期せぬ箇所でターミナルが止まったり、おかしい挙動を見せたりします。1.1)、落ち着いて対処してみましょう)。すべてのユーザーを表示するこの節では、いよいよ最後から2番目のユーザーアクションであるindexアクションを追加しましょう。このアクションは、すべてのユーザーを一覧表示します。10.8に示します7。ユーザーを削除できる機能も実装していきます。ユーザーの一覧ページユーザーの一覧ページを実装するために、まずはセキュリティモデルについて考えてみましょう。サイトを訪れたすべてのユーザーから見えるようにしておきますが、ユーザーのindexページはログインしたユーザーにしか見せないようにし、未登録のユーザーがデフォルトで表示できるページを制限します8。