毎回使いたくなるたびに調べ直しているので個人的な備忘録がてらまとめておきます。
メソッド | 用途 |
---|---|
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
まとめ
説明の不備・不足等ございましたら、ご指摘いただけますと助かります。