首頁  >  問答  >  主體

ruby-on-rails - Ruby 中方法名与@的混淆

module SessionsHelper
  .
  .
  .

  # Returns the user corresponding to the remember token cookie
  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

  # Returns true if the user is logged in, false otherwise
  def logged_in?
    !current_user.nil?
  end

  # Logs out the current user
  def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
  end
end

最后两个 def 中的 current_user 到底指的是什么?是上面定义的 current_user 方法吗?
而以上代码中的 @current_user 又指的是什么?感觉有点混淆了,求解答。

天蓬老师天蓬老师2761 天前576

全部回覆(3)我來回復

  • 迷茫

    迷茫2017-04-22 09:02:26

    @current_user 是一個實例變量,current_user是這個module中的方法,最後兩個方法呼叫current_user是指呼叫上面的current_user這個方法。 在同一個類別中實例方法直接是可以直接用方法名稱來實現呼叫的。
    @current_user是current_user方法中的一個回傳值。最後兩個方法呼叫current_user方法,實際上就是得到實例變數@current_user.

    回覆
    0
  • 迷茫

    迷茫2017-04-22 09:02:26

    @current_user 是全域類別的變量,current_user 是方法名,在ruby中對方法的呼叫可以省略(),所以初學者容易混淆,@current_user 的值為nil(@xxx 初始化的值為nil)或current_user返回的值。

    回覆
    0
  • 黄舟

    黄舟2017-04-22 09:02:26

    補償一下,current_user实际上代指current_user这个方法返回的@current_user实例变量。因为这里我们获得的是current_user呼叫後的回傳值。

    回覆
    0
  • 取消回覆