24
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

【Sorcery】Sorceryで使えるようになるメソッドとその活用例

SorceryのGitHubに書いてあることをまとめました。
Coreのものだけです。実際の使用法、活用例などを挙げているので参考になればと思います。
公式GitHubではメソッド名をクリックすると定義のページに飛びますので、詳しいコードはそちらをご覧ください。

require_login

ログインをしていないユーザーをアクション単位で弾く。
アクセスしようとしたURLをセッションに格納し、not_authenticatedを実行するメソッド。
以下のようにbefore_actionで指定する。

hoges_controller.rb
before_action :require_login

アクションごとに変える場合は、only: :actionを付ける。
アクション内の分岐など、もっと細かい単位で弾きたい場合は後述のlogged_in?を使う。

not_authenticated

先ほどのrequire_login内で、このメソッドも実行される。
デフォルトではredirect_to root_path(自動的にルートに飛ばされる)と定義されているが、カスタマイズしたい場合はapplication_controllerで上書きをする。

application_controller.rb
class ApplicationController < ActionController::Base
  protected

  def not_authenticated
    redirect_to login_url, alert: 'ログインしてください'
  end
end

auto_login(user)

その名の通りオートログイン。メールアドレスやパスワードを使わずuserとしてログインする。
想定される使い方としては、以下のようなものが挙げられる。

ユーザー登録後の自動ログイン

app/controllers/users_controller.rb
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

ゲストユーザーログイン

app/controllers/user_sessions_controller.rb
class UserSessionsController < ApplicationController
  def guest_login
    guest_user = User.find_by!(role: 'guest')
    auto_login(guest_user)
    redirect_to root_path, notice: 'ログインしました'
  end
end

開発環境でのログイン

app/controllers/user_sessions_controller.rb
class UserSessionsController < ApplicationController
  def login_as
    user = User.find(params[:user_id])
    auto_login(user)
    redirect_to root_path, notice: "#{Rails.env}環境でログインしました"
  end
end
config/routes.rb
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で返す。コントローラ、ビューで使える。
ログインしているかどうかによって場合分けをしたいときに使うことが多い。

view.html.erb
<% 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にも対応しています。

user_sessions_controller.rb
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
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
24
Help us understand the problem. What are the problem?