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