" CURRENT_USER" RoR教程之后的变量范围混淆

时间:2014-08-25 01:06:30

标签: ruby-on-rails ruby scope railstutorial.org

注意:在我在railstutorial.org上开始教程之前,我完成了codecademy的Ruby教程。

我正在关注Michael Hartl的Ruby on Rails教程。我在第8章,我在sessions_helper.rb文件中。有一个名为“current_user”的变量。我在遵循Ruby教程时学习了范围,但现在我在应用我学到的东西时遇到了麻烦。

在本教程中,有以下代码:

module SessionsHelper
    def sign_in(user)
        remember_token = User.new_remember_token
        cookies.permanent[:remember_token] = remember_token
        user.update_attribute(:remember_token, User.digest(remember_token))
        self.current_user = user
    end

    def signed_in?
        !current_user.nil?
    end

    def current_user=(user)
       @current_user = user 
    end

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

特别是,我不明白的是

之间的区别

a)self.current_user b)@current_user c)current_user

我在概念中了解全局变量,实例变量和局部变量,但在应用程序中却没有。如果我在没有本教程的训练轮的情况下自己编写代码,我就不知道何时使用哪个。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

current_user如果您没有明确声明局部变量,它将在当前范围内查找方法,在本例中为def current_user方法。

@current_user是一个实例变量。 Rails魔法之一是将所有实例变量从控制器复制到视图中。在这种情况下,它可能来自您的控制器或ApplicationController,它可能继承自。{/ p>

self.current_usercurrent_user相同,只是代码中的self.current_user=表示您正在使用其下方声明的方法,而不是分配本地变量。

current_user = "pedro"
current_user # "pedro"
self.current_user # method called

如果没有声明局部变量,这就是current_user

的情况
current_user # method called
self.current_user # same method called