これまでに作った機能について簡単にまとめていく。
今回は、
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 %>
以上で作成完了