3

変数が存在しない場合に変数を設定するために、アプリケーションコントローラーメソッドでよく使用されるまたは等しい||=を見てきました。Railscasts 270の最新版です。しかし、質問があります。たとえば、このヘルパーメソッドを取り上げます。

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

私の理解では、@ current_userは、まだ存在しない場合に設定されます。これは、レールがデータベースに送信されたり、パフォーマンスが向上したりする必要がないことを意味します。

ただし、@current_userのスコープについては混乱しています。私たちのウェブサイトのユーザーが2人いるとしましょう。最初のもの(彼を「bob」と呼びましょう)がサイトに来て、@current_userを彼のユーザーオブジェクトに設定します。2番目のオブジェクト( "john")が入って、railsが@current_userを要求すると、ユーザーオブジェクトがまだbobではないのはなぜですか?結局のところ、bobがサイトにヒットしたときに@current_userがすでに一度設定されているので、変数は存在しますか?

混乱している。

4

1 に答える 1

5

接頭辞が付いた@変数はインスタンス変数です(つまり、クラスの特定のインスタンスに固有の変数です)。Johnのサイトへのアクセスは、別のコントローラーインスタンスによって処理される@current_userため、彼には設定されません。

于 2011-07-28T21:12:05.413 に答える