2016-03-19 4 views
0

私はRailsを学んでおり、ユーザがログインしていない場合はページへのアクセスを制限しようとしています。ログインしているユーザのためだけにRailsアプリケーションへのアクセスを制限する

現在、私のコードは、ユーザーがログインするとセッションを作成し、ユーザーがログアウトするとそのセッションをクリアします。私は、ユーザーがログインしているが、私は彼/彼女がログインしていない場合は、アプリケーション全体でユーザーをリダイレクトする方法がわからないんだかどうかを確認することができるように、私はセッションヘルパーを持っている

UPDATE:。

  1. 質問を投稿したとき、私はbefore_filterで作業する何かを得ることができました。 before_actionまたはbefore_filterを使用する必要がありますか?

  2. アクセスを制限したいすべてのコントローラで同じ方法をコピーする必要がありますか?

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 

答えて

2

before_actionを使用できます。レールガイドは、その上の例で素敵なsectionを持っている:私は質問を投稿したよう

class ApplicationController < ActionController::Base 
    before_action :require_login 

    private 

    def require_login 
    unless logged_in? 
     flash[:error] = "You must be logged in to access this section" 
     redirect_to new_login_url # halts request cycle 
    end 
    end 
end 
+0

、私はbefore_filterで動作するように何かを得ることができました。 before_actionまたはbefore_filterを使用する必要がありますか?また、私のすべてのコントローラーで同じメソッドをコピーする必要はありませんか? – Bhav

+0

@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'を使って無効にすることができます。 –

+0

@ emil.p.stanchev申し訳ありません、これは超古いですが、このメソッドを使用すると、エラーが発生しました。 – beckah

関連する問題