🦔

【Rails】Deviseのヘルパーメソッド

2023/06/25に公開

Deviseとは

Deviseは、Railsで認証機能を簡単に実装するためのGem(便利なツールを導入できる追加パッケージ)です。
Deviseを使うことで、ユーザーの登録、ログイン、ログアウト、パスワードのリセットなど、一般的な認証機能を簡単に導入することができます。

Deviseのヘルパーメソッド

以下にDeviseのヘルパーメソッドをまとめます。

ヘルパーメソッド 説明
current_user 現在ログインしているユーザーのインスタンスを返します。ログインしていない場合は nil を返します。
user_signed_in? ユーザーがログインしているかどうかを判定します。ログインしている場合は true、そうでない場合は false を返します。
authenticate_user! ユーザーがログインしていない場合に、ログイン画面にリダイレクトします。認証が必要なアクションを保護するために利用されます。

具体例は以下の通りです。

1. current_user

current_user メソッドは、現在ログインしているユーザーの情報を取得します。コントローラー内ではインスタンス変数に代入して利用し、ビュー内ではログイン状態に応じた表示を行います。

# コントローラー内での使用例
def show
  @user = current_user
  # 現在ログインしているユーザーの情報を取得して表示する処理
end

# ビュー内での使用例
<% if user_signed_in? %>
  <p>Welcome, <%= current_user.name %></p>
<% else %>
  <p>Please sign in</p>
<% end %>

2. user_signed_in?

user_signed_in? メソッドは、ユーザーがログインしているかどうかを判定します。コントローラーやビュー内で使用され、ログイン状態に応じた処理や表示を行う際に利用します。

 # コントローラー内での使用例
 def edit
   unless user_signed_in?
     redirect_to new_user_session_path
   end
   # ユーザーがログインしていない場合はログインページにリダイレクトする処理
 end

 # ビュー内での使用例
 <% if user_signed_in? %>
   <p>Welcome, <%= current_user.name %></p>
 <% else %>
   <%= link_to "Sign in", new_user_session_path %>
 <% end %>

3. authenticate_user!

authenticate_user! メソッドは、ユーザーがログインしていない場合に自動的にログイン画面にリダイレクトします。コントローラー内で使用され、特定のアクションに対して認証を要求する際に利用します。

  • only の使用例
class UsersController < ApplicationController
  before_action :authenticate_user!, only: [:edit, :update]
  # :edit アクションと :update アクションに対して認証を要求する

この例では、:edit アクションと :update アクションに対してのみ、認証を要求しています。つまり、これらのアクションを実行する前にユーザーがログインしている必要があります。その他のアクションについては、認証を要求せずにアクセスが可能です。

  • except の使用例
class UsersController < ApplicationController
  before_action :authenticate_user!, except: [:index, :show]
  # :index アクションと :show アクション以外は認証を要求しない

この例では、:index アクションと :show アクションを除く全てのアクションに対して認証を要求しています。つまり、これらのアクションを実行する前にユーザーがログインしている必要があります。しかし、:index アクションと :show アクションについては、認証を要求せずにアクセスが可能です。


実際に実装したことはあったけど、恥ずかしながらdeviseのヘルパーメソッドだとはわからず使っていました。メソッドの背景も知ることは、正しく使用する方法を理解することにも繋がるので重要ですね。

Discussion