【问题标题】:Ruby on Rails Tutorial by Michael Hartl, Chapter 8, "Current User" sectionMichael Hartl 的 Ruby on Rails 教程,第 8 章,“当前用户”部分
【发布时间】:2013-05-09 23:57:41
【问题描述】:

我是 Rails 新手,并且一直在阅读 Michael Hartl 的 Rails 教程。到目前为止,我已经能够理解教程中的所有内容,但现在我想我在第 8 章的中途被卡住了。我希望更有经验的 Rails 程序员确认我正确地遵循了作者的解释.我在下面专门谈论Chapter 8, Section 8.2.3

在第 8.2.3 节中,“sign_in”方法有一行:

self.current_user = user

所以通过使用“self”而不是“current_user”,current_user 已成为 Session 的一部分,但尚未存储在数据库中,对吗?

如果是这样,Listing 8.22 中列出的方法是 getter 和 setter 方法,对吗?第一个将 current_user 存储在数据库中,第二个根据需要检索它?

最后,需要 getter 和 setter 方法是因为在方法中公开实例变量(在本例中为“sign_in”)是不好的做法?换句话说,替换是不好的:

self.current_user = user

@current_user = user

在“sign_in”方法中?

感谢任何帮助和建议。 谢谢。

【问题讨论】:

    标签: railstutorial.org


    【解决方案1】:

    我对Rails不是很精通,但是这里是我外行对SessionsHelper中方法的理解。

    首先,@current_user 是模块SessionsHelper 的实例变量。这意味着它持续用于SessionsHelper 中方法的后续调用。


      def sign_in(user)
        cookies.permanent[:remember_token] = user.remember_token
        self.current_user = user
      end
    

    所以通过使用“self”而不只是“current_user”,current_user 已成为 Session 的一部分,但尚未存储在数据库中,对吗?

    self.current_user = user 确实使 'current_user' 成为任何事物的一部分。
    self 指的是它自己,SessionsHelper
    self.current_user = 有效调用它的自己的方法,setter方法,def current_user=(user)


    如果是这样,清单 8.22 中列出的方法是 getter 和 setter 方法,对吗?

    是的。

      def current_user=(user) # Setter.
        @current_user = user
      end
    

    第一个将 current_user 存储在数据库中,

    没有。第一种方法current_user= 确实将任何内容存储到数据库中。它所做的只是将实例变量@current_user 设置为user


      def current_user # Getter.
        @current_user ||= User.find_by_remember_token(cookies[:remember_token])
      end
    

    第二个根据需要检索它?

    第二种方法current_user 返回一个现有 @current_user 值。
    如果@current_usernil(null),它会运行

    ||= User.find_by_remember_token(cookies[:remember_token])
    

    它根据浏览器的 remember_token cookie 从数据库中检索 @current_user 并将其设置为 User


    最后,需要 getter 和 setter 方法,因为在方法中公开实例变量(在本例中为“sign_in”)是不好的做法?

    在我看来,getter 和 setter 方法并不是完全需要的。可以在整个帮助程序中只使用@current_user
    但是,Devise (a popular user authentication gem) 在其助手中使用了current_user 方法。这个comment 也很重要。


    换句话说,在“sign_in”方法中将self.current_user = user替换为@current_user = user会很糟糕?

    @current_user = user 替换它应该没有错。这个question(与上面链接的评论相同的链接)向您展示了本教程的功能是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多