目的
SNSサイトにて、ログインの有無でアクセス制限したいときの処理をメモにまとめます。
サイト構成
作成したサイトの構成は下記です。
routes.rb
# ログイン中はアクセス制限
get "/" => "users#login_form"
post "/login" =>"users#login"
get "/new" => "users#new"
post "/users/create" => "users#create"
# ログアウト中はアクセス制限
get "/edit/:id" => "users#edit"
post "/users/update/:id" => "users#update"
post "/logout" => "users#logout"
current_userの準備
ログイン中のユーザーを@current_user
で定義します。
これは全てのコントローラで使用する変数なので、application_controller
で定義し、before_action
に設定します。
application_controller.rb
before_action :set_current_user
def set_current_user
@current_user = User.find_by(id: session[:user_id])
end
ここで定義した@current_user
はapplication_controller
内の別の定義式内でも使用可能です。
ログインしてない時のアクセス制限
application_controller.rb
def authenticate_user
if @current_user == nil
flash[:notice] = "ログインが必要です"
redirect_to("/")
end
end
users_controller
で適応させるアクションを指定します。
users_controller.rb
before_action :authenticate_user, {only: [:edit, :update, :logout]}
ログインしている時のアクセス制限
application_controller.rb
def forbid_login_user
if @current_user
flash[:notice] = "すでにログインしています"
redirect_to("/shops/index")
end
end
users_controller
で適応させるアクションを指定します。
users_controller.rb
before_action :forbid_login_user, {only: [:login_form, :login, :new, :create,]}
まとめ
ログインの有無でアクセス制限をかける方法をまとめました。
before_action
でonly
を指定しなければ全てのアクションに対して実行されます。