2016-11-07 11 views
1

私は大きなレールプロジェクトに取り組んでいます。 (そこに他の変数のためにこれらのbefore_filter方法のトンが実際にしているが、私は、たとえば、このいずれかを使用しています)@current_user変数を設定するbefore_filterを使用するクラスの束があります。Railsのベストプラクティス:before_filterまたはapplication_controllerヘルパーメソッドを使用しますか?

before_filter :current_user 

アプリケーションコントローラのCURRENT_USERメソッドを呼び出します。

class ApplicationController < ActionController::Base 

    def current_user 
     @current_user ||= session[:user_id].present? ? User.includes(:memberships).find(session[:user_id]) : nil 
    end 

他のオプションはapplication_controllerヘルパーメソッドを使用することです:

class ApplicationController < ActionController::Base 
    helper_method :get_current_user 

    def get_current_user 
     @current_user ||= session[:user_id].present? ? User.includes(:memberships).find(session[:user_id]) : nil 
    end 

その後、私はすべて交換してくださいヘルパーメソッドを呼び出して、アプリで@current_user参照:

get_current_user 

これは右、メソッドだけそれが必要だ方法やビューに呼び出されることを保証しますか! before_filterを使用することによるパフォーマンス上の利点はありますか?

+0

「get_current_user」と呼ぶ必要はありません。典型的なRubyコードでは、 'get_'部分は冗長です。ここでの唯一の違いは、あなたがそれを強制的にロードしていることです。これは、遅延読み込みの目的に反するものです。 – tadman

答えて

1

あなたのケースでは、どちらも同じように動作し、得られた結果で等しいです - インスタンス化されたインスタンス変数@current_user

helper_method

はヘルパーとしてコントローラメソッドを宣言する。たとえば、次のような は、current_userとlogged_inを作成します。 (before_filterが廃止されているため)図 に利用可能な制御方法が

before_action

アクション

ためメモ化の

前にコールバックを追加した結果は、両方の場合で同じであり、使用されています。

before_actionとの違いは、実際にはアクションが呼び出されるたびにメソッドが呼び出されますが、helper_methodではヘルパーが提供されます。両方で実行されるロジックが複雑な場合は、実際にはパフォーマンスの差があります。before_actionはより多くのリソースを消費します。

P.S. 2つのものが違っていて、その使い方が異なり、実際にそれらを比較することはできません。

+0

これは参考になります。私はアプリを書いていないし、たくさんの異なるコントローラ(これらのうちいくつかはbefore_filterを 'except'または 'only'で修飾してフィルタリングしたもの)の呼び出しがあります。したがって、必要に応じてbefore_actionメソッドを追加するのではなく、必要に応じて呼び出されるヘルパーメソッドを使用するだけでDRYerを継ぎ足すことができます。 @current_userインスタンス変数を保持する方法はありますか?それが必要なときにインスタンス化されるように、application_controllerメソッドに結び付けますか? –

+0

@yeldarb 'helper_method'を' application_controller.rb'に移動するだけで、すべてのコントローラで利用できるようになります –

関連する問題