Help us understand the problem. What is going on with this article?

Rails deviseで使えるようになるヘルパーメソッド一覧

More than 3 years have passed since last update.

毎回使いたくなるたびに調べ直しているので個人的な備忘録がてらまとめておきます。

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

※モデル名にUser以外を使用している場合、それぞれのメソッドの『user』部分を書き換える
ex.モデル名がmemberの場合、

  • before_action :authenticate_member!
  • member_signed_in?
  • current_member
  • member_session

before_action :authenticate_member!
となる。

以下に各メソッドの補足を書いていきます。

before_action :authenticate_user!

コントローラーの先頭に記載することで、そこで行われる処理はログインユーザーによってのみ実行可能となります。
下記の通り記載した場合、記事の一覧、詳細を確認することができるのはログインユーザーのみとなります。

class ArticlesController < ApplicationController
  before_action :authenticate_user!

  def index
  end

  def show
  end
end

下記のように記載し、一覧(index)は未ログインユーザーでも実行可能・詳細(show)はログインユーザーのみ実行可能とすることも可能です。

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

  def index
  end

  def show
  end
end

user_signed_in?

before_action :authenticate_user!よりも細かい分岐でログイン/未ログインの処理を分岐することができます。
コントローラー、ビュー問わず使用できます。

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

  def index
    flash[:notice] = "ログイン済ユーザーのみ記事の詳細を確認できます" unless user_signed_in?
  end

  def show
  end
end
...
<body>
  ...
  <% if user_signed_in? %>
    <%= render 'layouts/login_user_header' %>
  <% else %>
    <%= render 'layouts/no_login_user_header' %>
  <% end %>
  ...
</body>
...

自分はログイン状態によってレイアウトを分けるときによく使っています。

current_user

一番利用頻度が高いかも。
現在ログインしているユーザーをモデルオブジェクトとして利用できます。
関連付けがされている場合、子要素・親要素の取得などが可能です。

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

  def index
    flash[:notice] = "ログイン済ユーザーのみ記事の詳細を確認できます" unless user_signed_in?
  end

  def show
  end

  def new
    @article= current_user.articles.build
  end
end

ユーザーのメールアドレスを表示したい場合

...
<div>あなたのメールアドレス:<%= current_user.email %></div>
...

user_session

ユーザーのセッション情報を設定・取得することができます。
下記コードはdeviseのサンプルコードより参照しました。
有効期限の設定やDBに保存するほどではないステータスの保持に使う感じでしょうか。
恥ずかしながら実際に開発で使用したことがありませんので、お詳しい方補足いただければ幸いです。

class ArticlesController < ApplicationController
...
  def index
    user_session[:cart] = "Cart"
    respond_with(current_user)
  end
...
  def expire
    user_session['last_request_at'] = 31.minutes.ago.utc
...
  end
...
end

まとめ

説明の不備・不足等ございましたら、ご指摘いただけますと助かります。

tobita0000
Golang/TypeScriptをメインで使っているフリーのエンジニアです。Docker/Kubernetesなどもちょこちょこやります。趣味でベースを弾きます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした