before_actionの書き方について
訂正前
app/controllers/users_controller.rb
class UsersController < ApplicationController
before_action :authenticate_user, only: [: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 @user, success: "登録に成功しました。"
else
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
protect_from_forgery with: :exception
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)
end
end
sessions_controller.rb
class SessionsController < ApplicationController
skip_before_action :authenticate_user, only: [: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 user, success: "ログインしました。"
else
render 'new'
end
end
def destroy
log_out
redirect_to root_url, success: "ログアウトしました。"
end
end
users_controller.rb
class UsersController < ApplicationController
skip_before_action :authenticate_user, only: [: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 @user, success: "登録に成功しました。"
else
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