2017-08-23 6 views
0

私はRoRの程度マイケル・ハートルのチュートリアルを読んでいる、第8章では、私はこれらのメソッドを書いた:章8.2 - @current_userまたはCURRENT_USER

module SessionsHelper 
    def login(user) 
    session[:user_id] = user.id 
    end 

    def current_user 
    @current_user ||= User.find_by(id: session[:user_id]) 
    end 

    def logged_in? 
    !current_user.nil? 
    end 
end 

このコードは正常に動作します。私はcurrent_user方法を取り除くことを試み、そして次にコードを変更:

module SessionsHelper 
    def login(user) 
    session[:user_id] = user.id 
    @current_user = User.find_by(id: session[:user_id]) 
    end 

    def logged_in? 
    !(@current_user.nil?) 
    end 
end 

私はlogged_in?を呼び出すと、それは常にfalseを返します。 @current_userにアクセスするためにcurrent_userメソッドに電話する必要があるのはなぜですか? @current_userは、この変数がインスタンス変数であるため、このモジュールのすべてのメソッドで使用できます。

答えて

0

current_userメソッドを呼び出すことがない場合、@current_userは決して初期化されません(値が割り当てられます)。したがって、@current_userを参照するたびに、nilとなります。つまり、logged_in?または!(@current_user.nil?)は、falseとなります。

+0

ログインメソッドの@current_user = User.find_by(id:session [:user_id])を割り当てました –

+0

'logged_in? 'を呼び出す前に' login'は常に呼び出されていますか? – sawa

+0

いいえ、そうではありません。私は@current_userがインスタンス変数であるため、@current_userを利用できると思っていました。 –

関連する問題