SorceryのGitHubに書いてあることをまとめました。
Coreのものだけです。実際の使用法、活用例などを挙げているので参考になればと思います。
公式GitHubではメソッド名をクリックすると定義のページに飛びますので、詳しいコードはそちらをご覧ください。
require_login
ログインをしていないユーザーをアクション単位で弾く。
アクセスしようとしたURLをセッションに格納し、not_authenticated
を実行するメソッド。
以下のようにbefore_action
で指定する。
before_action :require_login
アクションごとに変える場合は、only: :action
を付ける。
アクション内の分岐など、もっと細かい単位で弾きたい場合は後述のlogged_in?
を使う。
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
auto_login(user)
その名の通りオートログイン。メールアドレスやパスワードを使わずuser
としてログインする。
想定される使い方としては、以下のようなものが挙げられる。
ユーザー登録後の自動ログイン
class UsersController < ApplicationController
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
end
end
ゲストユーザーログイン
class UserSessionsController < ApplicationController
def guest_login
guest_user = User.find_by!(role: 'guest')
auto_login(guest_user)
redirect_to root_path, notice: 'ログインしました'
end
end
開発環境でのログイン
class UserSessionsController < ApplicationController
def login_as
user = User.find(params[:user_id])
auto_login(user)
redirect_to root_path, notice: "#{Rails.env}環境でログインしました"
end
end
Rails.application.routes.draw do
if Rails.env.development?
get '/login_as/:user_id', to: 'user_sessions#login_as', as: :login_as
end
end
「/login_as/1
などにアクセスすると自動的にそのユーザーとしてログインする」ので、if Rails.env.development?
は必ず付ける。
current_user
きっと一番よく使う。
現在ログイン中のuserを返す。コントローラ、ビューで使える。
logged_in?
現在ログイン中かどうか、true or falseで返す。コントローラ、ビューで使える。
ログインしているかどうかによって場合分けをしたいときに使うことが多い。
<% if logged_in? %>
<%= link_to 'プロフィール', user_url(current_user) %>
<% else %>
<%= link_to 'ログイン', login_url %>
<% end %>
redirect_back_or_to(dafault_url, flash_hash = {})
ログインのアクションで使う。
require_login
のときにセッションに格納されたURLまたはデフォルトのURLにリダイレクトする。
flash_hash
はデフォルトでsuccess, dangerにも対応しています。
class UserSessionsController < ApplicationController
def create
@user = login(params[:email], params[:password])
if @user
redirect_back_or_to root_url, success: 'ログインしました'
else
flash.now[:danger] = 'ログインに失敗しました'
render :new
end
end
end