创造了红宝石一个登录会话时,了解“CURRENT_USER”的概念(Understand “curr

2019-07-30 23:50发布

我经历了很大的迈克尔·哈特尔教程构建红宝石应用在这里 。

我想了解如何创建一个会话的概念,我被困在了解这一行:

self.current_user = user

在此方法:

module SessionsHelper

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

我理解创建与user_token一个cookie的整个概念。

但我不明白是什么呢 self.current_user = user 的手段,为什么它甚至有必要保留此行的代码-我与令牌的Cookie -为什么我需要知道当前用户?

而且,当做到这一点“自我”被存储-它不像一个flash[:success]参数,我可以在我的观点一见。 所以我不知道它在哪里。

也有这2种方法在同一模块中:

  def current_user=(user)
    @current_user = user
  end

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

而且还是我想的目的,连点了这个神秘的current user -是它的目的是为了创造@current_user全局变量视图中的使用?

如果是这样的-为什么有有这些2个复制功能def current_user=(user)def current_user

Answer 1:

一些东西。

首先,你正在阅读的方法名称错误(因为神秘的红宝石方法命名如何能这并不奇怪)。 def current_user=(user)实际被读取作为定义方法current_user=在一个需要参数user ,而def current_user限定的方法current_user不带参数。 这些分别被称为settergetter。

这里是一个参考: 红宝石(编程语言):什么是getter和setter方法在Ruby中?

这样解释了重复。 在你的下一个问题。

我不明白什么呢self.current_user =用户的手段

self本身就是一个话题,对得起自己的讨论,所以我甚至不会试图解释它(这里有一个参考了许多的)。 对于这个问题的目的是要记住,为了设置实例变量,你需要前缀你的任务只是重要的self ,甚至是类(如作其他用途这将是隐含的)之内。 该行的其余部分是将一个呼叫current_user=我如上所述,用参数设定器方法user

为什么它甚至有必要保留此行的代码 - 我与令牌的Cookie - 为什么我需要知道当前用户?

这是必要的原因是,你不想被从令牌每次你需要获得当前用户的时间查找用户。 看看getter方法:

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

它说的是:如果我没有抬头,并设置实例变量@current_user然而,再看看它; 如果我已经弄好了,然后就返回。 这节省了大量的仰视。

我认为,回答你的问题。 有很多的更深层次的问题( self等),你可以找到其他地方的更多信息。 这就是为什么你需要包括一个讨论self在SO制定者: 为什么红宝石制定者需要“自我”。 在类中的资格?

UPDATE:小的澄清,有关使用最后一个环节self为班级内制定者其实是有点离题,因为你在一个模块内从一个类调用它,而不是直接。 在一个模块中,上下文selfself.current_user = user将成为类,该模块包括内部,例如User.current_user如果它是在类中称为User ,等等。同样,对本身的讨论另一个话题...



Answer 2:

该方法def current_user=(user)基本上是该sign_in方法使用,以设定CURRENT_USER一个setter。

def current_user将返回@current_user或者如果没有设置它,它会发现它在由remember_token用户表。 这基本上可以让你在任何时间点获得CURRENT_USER。

self.current_user在sign_in方法的上下文将是指到调用类或模块在这种情况下。 这将调用current_userSession Helper模块。



文章来源: Understand “current_user” concept when creating a login session in ruby