从Rails教程Ch8 - 为什么不使用实例变量?

时间:2016-10-11 14:24:32

标签: ruby-on-rails

module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Returns the current logged-in user (if any).
  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end

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

目前正在编写第8章的Hartl的Rails教程,他可以让您为用户编写代码以便登录并保持登录状态。

在方法logged_in?下,为什么使用局部变量current_user代替@current_user

3 个答案:

答案 0 :(得分:1)

current_user不是局部变量,它是一种实例方法。

  

为什么不使用实例变量?

正在使用。

当您调用current_user方法时,它会返回一个实例变量@current_user,该变量恰好是User对象或nil

答案 1 :(得分:1)

那不是局部变量!他正在调用current_user方法,该方法返回@current_user值,所以链条为零。您需要查看ruby中的范围,以了解方法和实例变量以及局部变量如何相互作用!

答案 2 :(得分:1)

因为current_user - 是在同一模块中定义的方法。这种技术称为memoization。你可以在这里阅读http://www.justinweiss.com/articles/4-simple-memoization-patterns-in-ruby-and-one-gem/