ログイン要求処理とは、ログインしていないユーザーに対して特定のページを見せないようにするための処理です。
この記事では、ログイン要求処理の実装方法を簡単に解決しています。
$ rails g helper sessions
でhelperを用意して、current_user
とlogged_in?
を実装します。
module SessionsHelper
def current_user
@current_user ||= User.find_by(id: session[:user_id])
end
def logged_in?
!!current_user
end
end
def current_user
は、現在ログインしているユーザーを取得するメソッドです。
@current_user ||= User.find_by(id: session[:user_id])
は
@current_user
に現在のログインユーザーが代入されている場合 → 何もしません。
@current_user
に現在のログインユーザーが代入されていない場合 → User.find_by(...)
からログインユーザーを取得し、@current_user
に代入します。
def logged_in?
はユーザーがログインしている時はtrueを、ログインしていなければfalseを返します。
コントローラーについて考えていきます。
class ApplicationController < ActionController::Base
include SessionsHelper
private
def require_user_logged_in
unless logged_in?
redirect_to login_url
end
end
end
ApplicationController
に書いたメソッドは、すべてのControllerで使用できるようになります。
require_user_logged_in
メソッドを定義します。
require_user_logged_in
メソッドはログインの状態を確認して、ログインしていれば何もせず、ログインしていなければ強制的にログインページに戻します。
include SessionsHelper
を書いた理由としては、Helperで定義したlogged_in?
メソッドを使えるようにするためです。
ではrequire_user_logged_in
メソッドをUsersController
で使ってみます。
class UsersController < ApplicationController
before_action :require_user_logged_in, only: [:index, :show]
#以下省略
before_actionで指定されたindexとshowは、事前処理としてrequire_user_logged_in
メソッドが実行されます。
例えばある人がusers#indexにアクセスした際に、その人がログインしいればusers#indexが見れます。
しかし、ログインしていなければログインページに飛ばされます。
このようにして、会員制のサービスなどを作ることが出来ます。
以上です。