Rails4でログイン機能を作成する
Railsでログインだけする機能を作ってみる。
環境構築については下記を参照。
環境
- 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」を入力して「ログイン」ボタンをクリック
- 「ログアウト」リンクで最初に戻る