これまでに作った機能について簡単にまとめていく。
今回は、
Gemのデフォルトではないログイン機能の作成
Gem deviseを使用する場合はこちら
使用モデル
Userモデル
| カラム | データ型 | |
|---|---|---|
| 1 | name | string |
| 2 | string | |
| 3 | password_digest | string |
モデルの作成
$ rails g model User name:string mail:string password_digest:string
mailカラムにユニーク制約を追加
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
t.string :name
t.string :mail, unique: true
t.string :password_digest
t.timestamps
end
end
end
マイグレーションの実行
$ rails db:migrate
Gemの導入
gem 'bcrypt'
パスワードのハッシュ化を行うGem
has_secure_passwordの使用が可能になる
バリテーションの追加
class User < ActiveRecord::Base validates :name, presence: true validates :mail, presence: true, uniqueness: true has_secure_password validations: true end
validations: trueによりhas_secure_passwordのデフォルトのバリテーション
サインアップ時のpasswordの必須入力
passwordとpassword_confirmationの内容が一致することを追加
Userのルーティングの追加
Rails.application.routes.draw do resources :users, only: [:new, :create] end
Userコントローラーの設定
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
redirect_to root_path
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:name, :mail, :password, :password_confirmation)
end
end
サインアップ画面の作成
app/views/users/new.html.erb
<%= form_with(model: @user, local: true) do |f| %> <%= f.label :name %> <%= f.text_field :name %> <%= f.label :mail %> <%= f.email_field :mail %> <%= f.label :password %> <%= f.password_field :password %> <%= f.label :password_confirmation %> <%= f.password_field :password_confirmation %> <%= f.submit "アカウントを作成する" %> <% end %>
Session管理のルーティングの追加
Rails.application.routes.draw do resources :users, only: [:new, :create] resources :sessions, only: [:new, :create, :destroy] end
sessionコントローラーの設定
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(mail: params[:session][:mail].downcase)
if user && user.authenticate(params[:session][:password])
session[:user_id] = user.id
redirect_to root_path
else
flash[:danger] = 'ログインに失敗しました'
render 'new'
end
end
def destroy
session.delete(:user_id)
redirect_to new_session_path
end
end
ヘルパーメソッドの作成
app/helpers/sessions_helper.rb
module SessionsHelper
def current_user
@current_user ||= User.find_by(id: session[:user_id])
end
def logged_in?
current_user.present?
end
end
current_userは、現在ログインしているユーザーを取得するメソッド
logged_in?は、ログインの有無を判別するメソッド
ヘルパーモジュールをインクルード
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base protect_from_forgery with: :exception include SessionsHelper end
ログインフォームの作成
app/views/sessions/new.html.erb
<%= form_with(scope: :session, url: sessions_path, local: true) do |f| %> <%= f.label :email %> <%= f.email_field :mail %> <%= f.label :password %> <%= f.password_field :password %> <%= f.submit "ログイン" %> <% end %>
ログイン・ログアウトを行うヘッダーの作成
app/views/layouts/application.html.erb
<% if logged_in? %>
<%= link_to "ログアウト", session_path(current_user.id), method: :delete %>
<% else %>
<%= link_to "サインアップ", new_user_path %>
<%= link_to "ログイン", new_session_path %>
<% end %>
以上で作成完了
