americandog1993の日記

プログラマー歴半年のメモ

Railsで超シンプルなログインシステムを作ってみる

※これはただの初心者の勉強記録なのでもし参考にされる場合は充分注意・自己責任の上ご利用ください。また、間違いがありましたらコメント頂けると幸いです。

Railsチュートリアル8章までを三回くらいやってやっとおぼろげにわかってきた・・・かもしれない。

作りたいもの

  • nameとpasswordでログインできるシステム。
  • userは自分だけ。
  • ユーザ登録等の機能はなし。

環境

  • Cloud9 RubyonRails
  • Ruby 2.3.0p0
  • Rails 5.0.0.1

Gemfile

source 'https://rubygems.org'

gem 'rails',        '5.0.0.1'
gem 'bcrypt',       '3.1.11'
gem 'puma',         '3.4.0'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.0.0'
gem 'coffee-rails', '4.2.1'
gem 'jquery-rails', '4.1.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.4.1'

group :development, :test do
  gem 'sqlite3', '1.3.11'
  gem 'byebug',  '9.0.0', platform: :mri
end

group :development do
  gem 'web-console',           '3.1.1'
  gem 'listen',                '3.0.8'
  gem 'spring',                '1.7.2'
  gem 'spring-watcher-listen', '2.0.0'
end

group :production do
  gem 'pg', '0.18.4'
end

Railsチュートリアルから引っ張ってきたのでけっこう不要なのも混ざってると思う。
とりあえず取り込む。

$ bundle update
$ bundle install

Userモデル

Userを作って自分のnameとパスワードを入れる。

$ rails g model User name:string password_digest:string
$ rails db:migrate

カラムはこれだけでOK。
できたモデルにパスワードをそのまま保存しないためのおまじないを追加。

models/user.rb

class User < ApplicationRecord
    has_secure_password
end

シンプルイズベスト。
登録機能ないのでバリデーションも不要。

モデルができたので自分がログインするための情報を入れる。

$ rails c
> User.create(name: "americandog", password: "foobar", password_confirmation: "foobar")

カラム名をpassword_digestにしてhas_secure_password入れるといつの間にかpasswordとpassword_confirmationを入れる仕様になってる。
この辺の理解を流してしまってるので要復習。

Sessionsコントローラ

コントローラでログイン認証やらの操作を色々する。

まずコントローラを作る。
ビューはログイン画面(new)とログイン成功画面(create)を作る。

$ rails g controller Sessions new create

newをログイン画面にする。

views/sessions/new.html.erb

<h1>Log in</h1>
<%= form_for(:session, url: login_path) do |f| %>

  <%= f.label :name %>
  <%= f.text_field :name %>

  <%= f.label :password %>
  <%= f.password_field :password %>

  <%= f.submit "Log in"%>
<% end %>

createはなんでもいいが、今回はLogined!と表示させる。

view/create.html.erb

Logined!

続いてコントローラの設定。

class SessionsController < ApplicationController
  def new
  end
  
  def create
    user = User.find_by(name: params[:session][:name])
    if user && user.authenticate(params[:session][:password])
      render 'create'
    else
      render 'new'
    end
  end
end

入力されたnameとpasswordが正しければcreateにいく。
つまりLogined!が表示される。
間違っていれば再びnewを表示。
エラー文を出すとなおいいのだけどそれはまた今度ということで(Railsチュートリアルにも載ってるしね)。

routes

config/routes.rb

Rails.application.routes.draw do
  root 'sessions#new'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
end

見てみる

$ rails s -b $IP -p $PORT

f:id:americandog1993:20170505130018p:plain

貧相なログイン画面が出てくるのでさっき設定したnameとpasswordを入力する。

f:id:americandog1993:20170505130130p:plain

成功。
name、passwordが違うと再びログイン画面が表示される。