こんにちは、Nanayakuです。
今回は、ログインしていないユーザーがURLを直接入力して、他人のページへの移動を防ぐログインチェックの書き方を紹介します。
「ログインチェック | Rails Training」を参考にしました。
目次
login_checkメソッドの作成
自分はユーザーのログインなどのメソッドを下記のように定義しました。
class ApplicationController < ActionController::Base protect_from_forgery with: :exception add_flash_types :success, :info, :warning, :danger helper_method :current_user, :logged_in?, :log_in def log_in(user) session[:user_id] = user.id end def current_user @current_user ||= User.find_by(id: session[:user_id]) end def logged_in? !current_user.nil? end end
これらのメソッドの詳しい解説は、「ログイン機能を追加」で解説しています。
ログインしているかどうかを確認するメソッド「login_check」を自分は下記のように書きました。
def login_check if current_user.nil? redirect_to root_url, danger: "ログインしてください" end end
これは、@current_userがnilだった場合、rootにリダイレクトされ、その時に「ログインしてください」とアラートが表示されると言う意味です。
他のcontroller(user・micropostなど)でも「login_check」が使用できるように「helper_method」に書き足します。
app/controllers/application_controller.rbは、最終的に以下のようになります。
class ApplicationController < ActionController::Base protect_from_forgery with: :exception add_flash_types :success, :info, :warning, :danger helper_method :current_user, :logged_in?, :log_in, :login_check def log_in(user) session[:user_id] = user.id end def current_user @current_user ||= User.find_by(id: session[:user_id]) end def logged_in? !current_user.nil? end def login_check if current_user.nil? redirect_to root_url, danger: "ログインしてください" end end end
users_controllerに定義
edit・update・show・destroyページにアクセスした時、そのuserがログインしているか確認するためにbefore_actionに「login_checkメソッド」を書きます。
「before_action」は、指定したアクションが行われる前に、発動するアクションを設定できます。
今回の場合は、edit・update・show・destroyアクションが行われる前に、そのユーザーはログインしているかを確認します。
class UsersController < ApplicationController before_action :login_check, {only: [:edit, :update, :show, :destroy]} def new @user = User.new end ・ ・ ・
「only」はアクションを指定するのに使用します。
これを書いていないと新規登録などが行えなくなります。
補足
helper_method で「login_check」を定義しているので、users_controller以外でも、「users_controllerに定義」のように書けば指定できます。
最後に
備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。