- sessionに情報を保存することで「ログイン」状態を実現する
- 逆に言えばsession破棄で「ログアウト」扱いになる
- Railsにはsessionオブジェクトが用意されており、これを使えば簡単にsessionへアクセス可能
……というわけで。
1. sessionコントローラを作成する
$ rails g controller sessions new create destroy
- コントローラ作成のときは複数形!
- newはログイン画面表示時に、createはログイン処理時に、destroyはログアウト処理時に使用
コントローラを作成したらとりまログイン処理を書いていく
def create↲ user = User.find_by_name(params[:name])↲ if user and user.authenticate(params[:password])↲ session[:user_id] = user.id↲ redirect_to tasks_url↲ else↲ redirect_to login_url, :alert => "無効なユーザー名/パスワードです。"↲ end↲ end↲
- フォームで入力した値など、URLパラメータを受け取るときはparamsを使う
- authenticateメソッドは、引数とuserのパスワードダイジェストを比較して論理値を返す
- タスク管理アプリを作っているので、ログイン成功時のリダイレクト先はtasks_url
- ちな、hoge_urlは絶対パス、hoge_pathは相対パスになるらしい
- 302 Redirectでは完全修飾URLに飛ぶのが仕様なので、redirect_toではhoge_urlを使う
- 失敗時はlogin_urlに返し、エラーメッセージを渡す
2. ログイン画面を作成する
/app/views/sessions/new.html.erbを編集
<div class="form">↲ <% if flash[:alert] %>↲ <p id="notice"><%= flash[:alert] %></p>↲ <% end %>↲ ↲ <%= form_tag do %>↲ <fieldset>↲ <legend>ログインして下さい</legend>↲ ↲ <div>↲ <%= label_tag :name, 'ユーザー名:' %>↲ <%= text_field_tag :name, params[:name] %>↲ </div>↲ ↲ <div>↲ <%= label_tag :password, 'パスワード:' %>↲ <%= password_field_tag :password, params[:password] %>↲ </div>↲ ↲ <div>↲ <%= submit_tag "ログイン" %>↲ </div>↲ </fieldset>↲ <% end %>↲ </div>↲
- 冒頭部分はログイン失敗時のalertメッセージ表示部分
- flashオブジェクトについて良くわかってないので要調査
- hoge_tagあたりのヘルパーメソッドももうちょっと調べときたい
3. ルーティング
config/routes.rbを編集してlogin周りのルーティングを設定する。以下の5行を追加。
controller sessions do get 'login' => :new post 'login' => :create delete 'logout' => :destroy end
- sessionsコントローラに対し、
- /loginにGETでアクセスした場合はsessions#newを呼ぶ
- /loginにPOSTでアクセスした場合はsessions#createを呼ぶ
- /logoutにDELETEでアクセスした場合はsessions#destroyを呼ぶ
- すなわちREST
ざっくり簡単だが、とりあえずこれで認証画面とログイン処理は実装完了。
まだログアウトはできていないし、ログイン後の処理なんかも書いてないけど、とりあえずやりかたはわかったのでメモ。