ログイン機能に必要なもの

・ログインページ(コントローラ生成)
・アクセス制限するページ(コントローラ生成)
 -> もしくはログイン時と未ログイン時を切り替えるページ
・ログインデータモデル(例:User)

ログイン処理の流れ

ログイン処理の実装準備

・ページの作成
 ログイン作業を行うページとアクセスを制限するページを作成します。

$ rails g controller login auth logout
$ rails g controller home index

・モデル作成
 ログインした人としてない人を判断するためにユーザ情報を管理するモデルを作成します。

$ rails g model User email password 

ログイン処理の実装

・ログインデータモデル
 ログインページのフォームから送られてきたメールアドレスとパスワードを受け取って、データがあればデータを送り返す。

app/models/user.rb

class User < ActiveRecord::Base
    def self.authenticate(email,password)
    user = find_by(email: email)
    if user != nil && user.password == Digest::SHA1.hexdigest(user.salt + password) then
      user
    else
      return
    end
  end
end

・ログインページ
 ログインページにメールアドレスとパスワードの入力フォームを付ける。@errorはエラーメッセージ。form_tagでフォームを生成、フィールドはメールアドレスとパスワードのテキスト入力、最後にログイン(送信)ボタンを配置。

app/views/login/index.html.erb

<p class="error">
  <%= @error %>
</p>

<%= form_tag action: :auth do %>

  <div class="field">
    <%= label_tag :email, 'メールアドレス' %><br />
    <%= text_field_tag :email, '', size: 40 %>
  </div>

  <div class="field">
    <%= label_tag :password, 'パスワード' %><br />
    <%= password_field_tag :password, '', size: 40 %>
  </div>

  <%= hidden_field_tag :referer, flash[:referer] %>
  <%= submit_tag 'ログイン' %>

<% end %>

・ログイン処理
 authはログインページでメールアドレスとパスワードを入力してログインを実行したときの処理。logoutはログアウトするときの処理。セッションを切ることでログイン情報を破棄してログインしていない状態にする。

app/controllers/login_controller.rb

class LoginController < ApplicationController
  skip_before_action :check_logined

  def auth
    user = User.authenticate(params[:email], params[:password])
    if user then
      reset_session
      session[:user] = user.id
      redirect_to params[:referer]
    else
      flash.now[:referer] = params[:referer]
      @error = 'メールアドレス/パスワードが間違っています。'
      render 'index'
    end
  end

  def logout
    reset_session
    redirect_to '/'
  end
end

・ログインを要求するページ

app/controllers/home_controller.rb

class HomeController < ApplicationController

  # ログインチェックのアクションを紐づける
  before_action :check_logined, only: :index

  def index
  end

  private
  def check_logined
    if session[:user] then 

      begin
        @user = User.find(session[:user])

      rescue ActiveRecord::RecordNotFound
        reset_session
      end
    end 

    unless @user 
      flash[:referer] = request.fullpath
      redirect_to controller: :login, action: :index
    end
  end

end

 Userデータを作成してあればログインを試すことができます。

スクリーンショット 2014-06-25 22.19.04