ぺーぺーSEのブログ

備忘録・メモ用サイト。

Rails4でログイン機能を作成する

Railsでログインだけする機能を作ってみる。
環境構築については下記を参照。

blog.pepese.com

環境

  • Windows 7
  • Ruby 2.0.0
  • Rails 4.1.1


手順

★ファイルは「UTF-8」で保存すること。

1.プロジェクト作成

> rails new LoginSample

2.プロジェクトディレクトリに移動

> cd LoginSample

3.Gemfileの下記の行を有効化

# gem 'bcrypt', '~> 3.1.7'

4.Gemfileの変更を有効化

> bundle install

5.ユーザモデル作成

> rails generate model user name:string password_digest:string

※「password_digest」は固定。

6.作成したユーザモデルのテーブル作成

> rake db:migrate

7.作成したテーブルを確認

> rails dbconsole
>> .tables
>> .schema users
>> .quit

usersテーブルの存在と定義を確認する。

8.user.rbを下記のように修正

class User < ActiveRecord::Base
  has_secure_password # 追加した行
end

9.userデータを登録

> rails console
>> User.create!(:name => "admin", :password => "test", :password_confirmation => "test")
>> exit

10.userデータが登録できたか確認

> rails dbconsole
>> select * from users;
>> .quit

11.ログイン用コントローラ作成

> rails generate controller logins

※コントローラは複数形で定義すること。

12.logins_controller.rbを下記のように修正

class LoginsController < ApplicationController
  def index
      render "index"
  end

  def show
      render "new"
  end

  def create
    user = User.find_by_name params[:name]
    if user && user.authenticate(params[:pass])
      # セッションのキー:user_idへユーザーのIDを登録
      session[:user_id] = user.id
      redirect_to root_path
    else
      # flash変数にメッセージをセット
      flash.now.alert = "もう一度入力してください。"
      render "new"
    end
  end

  def destroy
    session[:user_id] = nil
    @current_user = nil
    redirect_to root_path
  end
end

13.ログイン画面(views/logins/new.html.erb)を下記のように作成

<h1>ログイン画面</h1>

<!-- フラッシュ変数のメッセージを表示(ログインエラー時のみ) -->
<p><font color=red><%= flash[:alert] %></font></p>
<%= form_tag login_path do %>
<table id="login_form">
  <tr>
    <td><%= label_tag :name, 'ユーザー名' %></td>
    <td><%= text_field_tag :name, params[:name] %></td>
  </tr>

  <tr>
    <td><%= label_tag :pass, 'パスワード' %></td>
    <td><%= password_field_tag :pass, params[:pass] %></td>
  </tr>

  <tr>
    <td><%= submit_tag "ログイン" %></td>
  </tr>
</table>
<% end %>

14.application_controller.rbを下記のように修正

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  def current_user
    if session[:user_id]
      # @current_userがnilかfalseならログインユーザーを代入
      @current_user ||= User.find(session[:user_id])
    end
  end

  helper_method :current_user
end

ヘルパーメソッド「current_user」を定義している。

15.トップ画面(views/logins/index.html.erb)を下記のように作成

<h1>トップページ</h1>
<p>Hello Ruby!</p>

<% if current_user == nil %>
  <%= link_to "ログイン", login_path %>
<% else %>
  <%= link_to 'ログアウト', login_path, :confirm => 'ログアウトしますか?', :method => :delete %>
<% end %>

16.routes.rbを下記のように修正

Rails.application.routes.draw do
  root 'logins#index'
  resource :login, only: %i{show create destroy}
end

※単数系のresouceを使うのでloginsではなくloginにした。

17.ルーティングの確認

> rake routes
Prefix Verb   URI Pattern      Controller#Action
  root GET    /                logins#index
 login POST   /login(.:format) logins#create
       GET    /login(.:format) logins#show
       DELETE /login(.:format) logins#destroy

18.サーバを起動

> rails server

19.下記へアクセス
http://localhost:3000/

20.動作確認

  • 「ログイン」リンクをクリック
  • ユーザー名に「admin」、パスワードに「test」を入力して「ログイン」ボタンをクリック
  • 「ログアウト」リンクで最初に戻る


参考:
http://d.hatena.ne.jp/yk5656/20140315/1395468412