私はRailsを学んでおり、ユーザがログインしていない場合はページへのアクセスを制限しようとしています。ログインしているユーザのためだけにRailsアプリケーションへのアクセスを制限する
現在、私のコードは、ユーザーがログインするとセッションを作成し、ユーザーがログアウトするとそのセッションをクリアします。私は、ユーザーがログインしているが、私は彼/彼女がログインしていない場合は、アプリケーション全体でユーザーをリダイレクトする方法がわからないんだかどうかを確認することができるように、私はセッションヘルパーを持っている
UPDATE:。
質問を投稿したとき、私はbefore_filterで作業する何かを得ることができました。 before_actionまたはbefore_filterを使用する必要がありますか?
アクセスを制限したいすべてのコントローラで同じ方法をコピーする必要がありますか?
CODE:
/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
include SessionsHelper
end
/controllers/sessions_controller.rb
class SessionsController < ApplicationController
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
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
log_out
redirect_to root_url
end
end
/helpers/sessions_helper.rb
module SessionsHelper
# Logs in the given user.
def log_in(user)
session[:user_id] = user.id
end
# Returns the current logged-in user (if any).
def current_user
@current_user ||= User.find_by(id: session[:user_id])
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
# Logs out the current user.
def log_out
session.delete(:user_id)
@current_user = nil
end
end
、私はbefore_filterで動作するように何かを得ることができました。 before_actionまたはbefore_filterを使用する必要がありますか?また、私のすべてのコントローラーで同じメソッドをコピーする必要はありませんか? – Bhav
@Bhav before_actionを使用すると、before_filterは廃止され、Rails 5.1で削除されます(このSOの回答:http://stackoverflow.com/a/16519841/168377を参照)。 ApplicationControllerで 'require_login'と' before_action:require_login'を定義し、すべてのコントローラがそれを継承すると、デフォルトで有効になるので、何もコピーする必要はありません。適切な場所で 'skip_before_action'を使って無効にすることができます。 –
@ emil.p.stanchev申し訳ありません、これは超古いですが、このメソッドを使用すると、エラーが発生しました。 – beckah