##current_user
現在ログイン中のuserを返す。コントローラ、ビューで利用可能。
##require_login
ログインをしていないユーザーをアクション単位で弾く。
アクセスしようとしたURLをセッションに格納し、not_authenticatedを実行するメソッド。before_action
で指定する。
アクションごとに変える場合は、only: :action
を付ける。
#controller
before_action :require_login
##not_authenticated
require_login内で、このメソッドが実行される。
デフォルトではredirect_to root_path(自動的にルートに飛ばされる)と定義されている
が、カスタマイズしたい場合はapplication_controllerで上書きをする。
class ApplicationController < ActionController::Base
protected
def not_authenticated
redirect_to login_url, alert: 'ログインしてください'
end
end
##logged_in?
require_loginと比べて、アクション内の分岐などもっと細かい単位で弾きたい場合に使用。
現在ログイン中かどうか、true or falseで返す。コントローラ、ビューで使える。
ログインしているかどうかによって場合分けをしたいときに使う。
#view
<% if logged_in? %>
<%= link_to 'プロフィール', user_url(current_user) %>
<% else %>
<%= link_to 'ログイン', login_url %>
<% end %>
##auto_login(user)
メールアドレスやパスワードを使わずuserとしてログインする。(オートログイン)
想定される使い方としては下記が挙げられる。
・ユーザー登録後の自動ログイン
・ゲストユーザーログイン
・開発環境でのログイン
ユーザー登録後の自動ログイン
#controller
def create
@user = User.new(user_params)
if @user.save
auto_login(@user)
redirect_to root_url, notice: 'ユーザーを登録しました'
else
flash.now[:alert] = 'ユーザーが登録できませんでした'
render :new
end
ゲストユーザーログイン
#controller
def guest_login
guest_user = User.find_by!(role: 'guest')
auto_login(guest_user)
redirect_to root_path, notice: 'ログインしました'
end
開発環境でのログイン
#controller
def login_as
user = User.find(params[:user_id])
auto_login(user)
redirect_to root_path, notice: "#{Rails.env}環境でログインしました"
end
#routes
if Rails.env.development?
get '/login_as/:user_id', to: 'user_sessions#login_as', as: :login_as
end
「/login_as/1」などにアクセスすると自動的にそのユーザーとしてログインする」ので、if Rails.env.development?
は必ず付ける。