0

私のアプリケーションには、多くの種類のプロファイルがあるため、多くのルールを持つヘッダーがあります。

ユーザーを取得し、必要なすべてのチェックを行うために、 1 つのクエリ (おそらく 2 つ) を作成したい

私のアプリケーションコントローラーには、次のメソッドがあります。

def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
end

現在のユーザーを確認するには、header.html.erb で呼び出し続けます。10 回確認すると、10 回のクエリが実行されます...

私が最初に呼び出したときに知っている限り、使用current_userする変数@current_userを取得します。しかし、コントローラーを持っていると、これは明らかです。私は電話current_userし、私の見解では私はちょうどチェックし@current_user.somethingます。/layouts/_header.html.erb にはコントローラーがないため、どうすればこれを行うことができますか?

4

3 に答える 3

0

検索が成功した場合、複数のクエリを実行する必要はありません。クエリ@current_userの戻り値に設定され、将来はそれが返されます。ただし、ユーザーが見つからない場合は@current_userに初期化されるnilため、追加の呼び出しによりクエリが再度実行されますcurrent_user

defined?考えられる回避策の 1 つは、次のように演算子を使用することです。

def current_user
  return @current_user if defined?(@current_user)
  @current_user = User.find_by_remember_token(cookies[:remember_token])
end

ただし、現在のクロージャーで何かが定義されている場合、ルックアップが行われたかどうかに関係なく値が返されるため、この実装は好きではありません。現在のユーザーが検索されたかどうかを追跡する別の@current_user変数を設定し、検索された場合にのみクエリを実行することもできますが、それも私には見苦しく思えます。

この一般的な問題に対するより確実な解決策については、memoist gem を参照してください。またはさらに良いことに、deviseおよび/またはwardenが認証のニーズに適しているかどうかを検討しましたか?

于 2013-10-22T15:31:54.493 に答える
0

以下から

"多くの種類のプロファイルがあるため、多くのルールを持つヘッダーがあります"

ユーザーの役割に基づいて複数の条件を検証していると思います。私の推測が正しければ

役割ごとに個別のパーシャルを作成することをお勧めします。たとえば、管理者の役割がある場合は、

layouts/_admin.html.erb にパーシャルを作成する

次に、次のように含めることができます

<%= render "layouts/" +  current_user.role %>
于 2013-10-22T16:46:29.240 に答える