before_actionの書き方について

訂正前

 

app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :authenticate_useronly: [:show
  
  def index
    @users = User.all.page(params[:page])
  end

  def show
    @user = User.find(params[:id])
    @items = @user.items.uniq
    @count_want = @user.want_items.count
    @count_desire = @user.desire_items.count
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      log_in @user
      redirect_to @usersuccess: "登録に成功しました。"
    else
      flash.now[:danger= "ユーザの登録に失敗しました。"
      render :new
    end
  end

  def update
  end

  def edit
  end

  private
    def user_params
      params.require(:user).permit(:name:email:password:password_confirmation)
    end
  end

 

認証を書かける場合は、ブラックリスト方式(認証を行なわないページを明示的に除外する)の方が良いです。理由として、ホワイトリスト方式(認証ページを行うページを明示的に追加する)場合、本来認証を行なわなければならないページに認証を掛け忘れると行った事故が発生しかねないからです。ApplicationControllerでbefore_actionを設定して、認証を行なわないControllerにはskip_before_actionで認証をスキップするように設定が必要との指摘をいただきました。

 

訂正後

 

application.controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  
  add_flash_types :success:danger
  before_action :authenticate_user
  helper_method :current_user:logged_in?

  private
    def authenticate_user
      redirect_to login_url unless logged_in?
    end
    
    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.present?
    end

    def log_out
      session.delete(:user_id)
      @current_user = nil
    end
  end

 

sessions_controller.rb

class SessionsController < ApplicationController
  skip_before_action :authenticate_useronly: [:new:create

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      log_in user
      redirect_to usersuccess: "ログインしました。"
    else
      flash.now[:danger= "メールとパスワードの組み合わせが間違っています!"
      render 'new'
    end
  end

  def destroy
    log_out
    redirect_to root_urlsuccess: "ログアウトしました。"
  end
end

 

 

users_controller.rb

class UsersController < ApplicationController
  skip_before_action :authenticate_useronly: [:index:show:new:create:update:edit
  
  def index
    @users = User.all.page(params[:page])
  end

  def show
    @user = User.find(params[:id])
    @items = @user.items.uniq
    @count_want = @user.want_items.count
    @count_desire = @user.desire_items.count
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      log_in @user
      redirect_to @usersuccess: "登録に成功しました。"
    else
      flash.now[:danger= "ユーザの登録に失敗しました。"
      render :new
    end
  end

  def update
  end

  def edit
  end

  private
    def user_params
      params.require(:user).permit(:name:email:password:password_confirmation)
    end
  end