Railsでログイン処理っぽいものを作ってみる

RailsをMySQLに対応させてみるの続き
RailsのMySQLの環境にアクセスできるようにしておくも済ませておく)

下記のサイトを参考にして、ログイン処理を作ってみる。

【参考】
Ruby on Rails ログイン画面の作成 - ayaketanのプログラミング勉強日記
http://ayaketan.hatenablog.com/entry/2012/12/19/210231

gemのインストール

まず必要なgemをインストールする。

$ vi Gemfile
gem 'bcrypt-ruby', '~> 3.1.2'	←コメントを外す
$ bundle install

ユーザーのモデル

次に、ユーザーを管理するモデルを作成して、テーブルを作成する。

$ rails generate model user name:string password_digest:string
$ rake db:migrate

モデルの設定を追加する。

$ vi app/models/user.rb
lass User < ActiveRecord::Base
  has_secure_password	←追加
end

ユーザー追加

コンソールからユーザーを追加する。

$ rails console
irb(main):001:0> User.create!(:name => "admin", :password => "test", :password_confirmation => "test")
irb(main):002:0> exit

下記のような感じで追加される。

mysql> select * from users;
+----+-------+----------------------------+---------------------+---------------------+
| id | name  | password_digest            | created_at          | updated_at          |
+----+-------+----------------------------+---------------------+---------------------+
|  1 | admin | $2a$10$38u…xGprZovHge9geO | 2014-03-15 05:07:49 | 2014-03-15 05:07:49 |
+----+-------+----------------------------+---------------------+---------------------+

ビューの実装

ログイン用のビューを作成する。

$ mkdir app/views/sample
$ vi app/views/sample/index.html.erb
<%= @msg %><br />
<%= form_tag('/') do %>
  ユーザー名:<%= text_field_tag :name %><br />
  パスワード:<%= text_field_tag :pass %><br />
<%= submit_tag 'ログイン' %><br />

postできるようroutes.rbに追加する。

$ vi config/routes.rb
post '/' => 'sample#index'	←追加

コントローラの実装

ログイン用の処理を作成する。

$ vi app/controllers/sample_controller.rb
class SampleController < ApplicationController
  def index

    if session[:login] then
      @msg = session[:login] + 'でログイン中です'
    end

    if params.key?(:name) || params.key?(:pass)
      user = User.find_by_name params[:name]
      if user && user.authenticate(params[:pass])
        session[:login] = params[:name]
        @msg = 'ログインしました'
      else
        session[:login] = nil
        @msg = 'ユーザー名またはパスワードが間違っています'
      end
    end

  end
end

結果

http://サーバーのIPアドレス/
にアクセスすると下記のように表示される。

ユーザー名とパスワードを入力してログインボタンを押すと

下記のように表示される。

再度
http://サーバーのIPアドレス/
にアクセスすると、下記のように表示される。