--- categories: "Ruby on Rails" comments: true date: "2013-10-06T00:00:00+09:00" title: "RoRでログイン機能を実装する" --- * 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 => "無効なユーザー名/パスワードです。"endend↲ ``` * フォームで入力した値など、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 ざっくり簡単だが、とりあえずこれで認証画面とログイン処理は実装完了。 まだログアウトはできていないし、ログイン後の処理なんかも書いてないけど、とりあえずやりかたはわかったのでメモ。 ### 参考 [Ruby on Rails ログイン画面の作成 - ayaketanのプログラミング勉強日記](http://ayaketan.hatenablog.com/entry/2012/12/19/210231)