Ruby / Rails

[Rails・User]コントローラーのログインチェック

2019年9月10日

こんにちは、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に定義」のように書けば指定できます。

 

最後に

備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。

-Ruby / Rails
-

© 2024 Nanayaku blog Powered by AFFINGER5