0

私のアプリケーションでは、セッションの[]にユーザーのIDを格納します。すべてのコントローラのアクションの開始時に、私はApplicationControllerに呼ばCURRENT_USERで定義されたメソッド呼んでいる:私のコントローラのメソッドの開始時にRailsでページを表示する前にユーザーを適切に検証する方法

def current_user 
    @current_user ||= session[:current_user_id] && 
    User.find_by_id(session[:current_user_id]) 
    end 

を、私は次のようしている:

@current_user = current_user 
    if @current_user == nil  
    redirect_to :home   
    return      
    end       

これを明らかに繰り返しコードであり、どこかの方法でなければなりません。回答for this questionを読んで、自分のメソッドを親クラスに入れようとしましたが、私のコントローラクラスは今から降りてきましたが、今はそのメソッドからリダイレクトできないようです。私の親クラスで

、私が持っている:

def verify_user 
    user = current_user 
    if user == nil 
     redirect_to "/" 
     return 
    end 
    return user 
    end 

そして今、私はこれに私のコントローラメソッドを変更しました:

@current_user = verify_user 

これは動作しません、と私はなぜ知っていると思います。 1つは、verify_userメソッドでreturnを呼び出すことはできません。明らかにコントローラに戻るだけです。リダイレクトは影響を受けていないようです。リダイレクト呼び出しの後にformat.htmlが呼び出されている可能性があります。これが元のコードでのリターンの理由です。

私はここで間違っていますか、どのような提案をしなければなりませんか?これは間違ったアプローチですか?私の主な目標は、コントローラー方式ごとに1行のコードに「ユーザーが別の方法でリダイレクトしているかどうかを確認する」の全体を保つことです。

答えて

1

ApplicationControllerクラスに次のロジックを追加します。

class ApplicationController < ActionController::Base 

    def current_user 
    ... 
    end 

    def logged_in? 
    current_user.present? 
    end 

    def require_user 
    return true if logged_in? 
    render_error_message("You must be logged in to access this page", 
     new_user_session_url) 
    return false 
    end 

    def render_message message 
    respond_to do |format| 
     format.html { 
     if request.xhr? 
      render(:text => message, :status => :unprocessable_entity) 
     else 
      redirect_to(root_url, :notice => message)   
     end 
     } 
     format.json { render :json => message, :status => :unprocessable_entity } 
     format.xml { render :xml => message, :status => :unprocessable_entity } 
    end 
    end 

end 

は、今すぐあなたのコントローラにbefore_filterを追加します。

class OrdersController < ApplicationController 

    before_filter :require_user 

end 
+0

これは確かに動作しますが、私はまた、デバイスまたはそれのような他のものをチェックアウトする必要がありますが、 sguhaのポストで。 – Steve

2

devise gem https://github.com/plataformatec/deviseをご覧ください。この基本的なユーザー認証ロジックを多く処理します。この特定の問題は、防護が必要なコントローラまたはアクションにbefore_filter :authenticate_user!を追加することで解決できます。

関連する問題