deviseでログイン機能を追加する


Ruby On Railsでdeviseを扱う

deviseの導入

Gemfile
gem 'devise'
ターミナル
bundle install
rails g devise:install

ファイルを作成

ターミナル
# model
rails g devise user
rails db:migrate
# controller
rails g devise:controllers users
# views
rails g devise:views users

複数のログイン機能を作成する場合

必要な分だけファイルを用意する

ターミナル
# user用
rails g devise user
rails db:migrate
rails g devise:controllers users
rails g devise:views users

# staff用
rails g devise staff
rails db:migrate
rails g devise:controllers staffs
rails g devise:views staffs

設定ファイルを変更する

config/initializers/devise.rb
 # config.scoped_views = false
 # ↑コメントアウトを外してtrueにする
 config.scoped_views = true

ファイルについて

app/views/users/sessions/new.html.erb:       ログイン画面
app/views/users/registrations/new.html.erb:  新規登録画面

seedで管理者管理者を作成する

ターミナル
rails g devise adimn
rails db:migrate
rails g devise:controllers admin
rails g devise:views admin
db/seeds.rb
Admin.find_or_create_by(id: 1) do |admin|
  admin.email = "[email protected]"
  admin.password = "foobar"
end
ターミナル
rails db:seeds

ログアウトする

erb
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<%= link_to "ログアウト", destroy_medicalstaff_session_path, method: :delete %>

:authenticate_user!

deviseで使える便利なメソッド
ユーザがログインしているかどうかを確認し、ログインしていない場合はユーザをログインページにリダイレクトする。

controller.rb
class UsersController < ApplicationController
  # befor_actionと一緒に使う
  before_action :authenticate_user!

  def index
    @user = User.find(current_user.id)
    favorites = Favorite.where(user_id: current_user.id).pluck(:institution_id)
    @favorites_list = Institution.find(favorites)
  end

  def edit
    @user = User.find(current_user.id)
  end

  def update
    @user = User.find(current_user.id)
    if @user.update(user_params)
      redirect_to edit_user_path(current_user), notice: "プロフィール情報を更新しました"
    else
      render "edit"
    end
  end

  private
  def user_params
    params.require(:user).permit(:name, :image)
  end
end

日本語化

devise.ja.ymlを使う

devise.ja.ymlをconfig/localesに設置します。devise.ja.ymlはいくつか見本があるようです。

local/appricarion.rbconfig.i18n.default_locale = :jaを記述して、日本語設定をする。

config/application.rb
module Sample  #module名はわかりやすいものを
  class Application < Rails::Application
    config.i18n.default_locale = :ja
  end
end

gemを導入する

Gemfile
gem 'rails-i18n'
ターミナル
bundle install

参考資料

heartcombo/devise
【Rails】deviseを導入してみる
[Rails] deviseの使い方(rails6版)
Rails deviseで使えるようになるヘルパーメソッド一覧
【Rails】deviseのビューのform_forをform_withに置き換える

複数のログイン機能を作成する場合

Railsのdeviseを使って複数のユーザー別でログインする方法
deviceを使用して、adminモデルを追加する流れを分かりやすく解説

:authenticate_user!

【rails】authenticate_user!の使い方

日本語化

【Rails基礎】deviseを用いたフラッシュメッセージを表示する方法を簡単に解説
【Rails】deviseを利用したflashメッセージの表示方法