LoginSignup
16
16

More than 5 years have passed since last update.

【Rails】Devese gem のヘルパーメソッドを使ってログイン状態を検証する

Posted at

RailsTutorialを一通りした後Deviseを導入したアプリを作ることになったので
その時、便利に感じたこと、よく使うなと感じたことをまとめておこうと思います。
ちなみに全てのDeviseの機能を使用しているわけではないです。

動作環境

ruby , 2.5.1
rails , 5.1.6
Devise , 4.4

下記公式のGithubページ

Deviseとは

deviseはログイン認証機能を提供するgemです。
rails generate ~ するだけでログイン・ログアウト、新規ユーザの作成、削除、バリデーション等
昨今の Webサイトであるようなログイン機能をすばやく実装できます。

Deviseで使えるようになるヘルパーメソッド

Deviseで生成されたControllerとViewの内部で以下のメソッドが使えるようになります。

メソッド 機能
before_action :authenticate_user! ログイン済ユーザーのみにアクセスを許可
user_signed_in? ユーザーがサインイン済かどうかを判定する
current_user サインインしているユーザーを取得
user_session ユーザーのセッション情報にアクセスする

※モデル名がUser以外の場合、「user」部分を書き換える必要があります。

before_action :authenticate_user! の使い方

ログイン済でないとアクセスして欲しくないアクションに設定します。
デフォルトでログインしていない場合はログイン画面に遷移する仕様になっていますので
カスタマイズしたい場合はコントローラのリダイレクトを上書きしなければなりません。

class SampleController < ApplicationController
  before_action :authenticate_user!, only: [:show]

  def index
  end

  def show
  end
end

user_signed_in?の使い方

View等でログイン済みのユーザにのみ表示させる等特定のユーザ毎に表示させるオブジェクトを分けたい時に使えます。
例ではログイン済みの場合のみログアウトボタンが表示されます。

<%= link_to "ログアウト", destroy_user_session_path, class: "btn" if user_signed_in? %>

current_userの使い方

サインインしているユーザーとそのIDを取得して
例ではプロフィールをクリックすると、サインインしているユーザ個別のページを表示させるようなことができます。

<%= link_to "プロフィール", user_path(current_user.id) %>

※user_sessionについては私は使用したことがないです。

RSpecでDeviseのヘルパーメソッドを使かってみる

sign_in、sign_outのメソッドを使うことでユーザのログイン、ログアウトの状態を変更することできます。
まずは、rails_helperにDeviseのテストヘルパーをロードさせます。

rails_helper.rb
RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

#
# Rspec既存のコード
#

#Deviseのテストヘルパーを読み込ませる
config.include Devise::TestHelpers, :type => :controller

例ではControllerテストに記述。

sample_controller_spec.rb
require 'rails_helper'

RSpec.describe SamplesController, type: :controller do
  describe "#show" do
    #ユーザを生成
    before do
      user = FactoryBot.create(:user)
    #作ったユーザでログイン
      sidn_in user
    end
    # 正常にレスポンスを返すこと
    it "responds successfully" do
      get :show, params: {id: user.id}
      expect(response).to be_successful
    end
  end
end

初めて使ってみた感想

「なんかよくわからんけど、ログイン機能ができてる」みたいな印象。
そのため初心者からだと公式ドキュメント読んで仕様を理解するのが大変だと思います。
Deviseは便利ですが、こればっか使ってるとセッションや暗号化のやり方を忘れるので
Ruby on Rails Tutorialなんかで復習しないとなと思いました。

16
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16