Hartl Rails教程第8章:remember_token如何工作?

时间:2012-10-19 13:44:07

标签: attributes token railstutorial.org

在Michael Hartl教程的第8章中,我们设置了登录页面并在数据库中创建了一个新列以保存基本64字符串。在教程中,它被称为remember_token。在user.rb中:

  private

    def create_remember_token
        self.remember_token = SecureRandom.urlsafe_base64
    end

self有一个名为remember_token的属性?这是内置的还是在其他地方创建的?也许我只是不太了解这一点。

他写道:

  

由于Active Record基于的方式合成属性   数据库列,没有自己的赋值将创建一个本地   变量叫remember_token,这根本不是我们想要的。运用   self确保赋值设置用户的remember_token以便它   将在何时与其他属性一起写入数据库   用户已保存。

我很困惑,用户是如何获得记忆令牌的?如何将其写入该特定列中的数据库?

在user.rb中,您有以下代码:

attr_accessible :name, :email, :password, :password_confirmation

那里没有关于remember_token的信息。如何在User.save中包含此内容?

2 个答案:

答案 0 :(得分:1)

在此上下文中,self是一个User对象,由于Section 8.2.1 Ruby on Rails Tutorial中的迁移创建了数据库列,因此它具有remember_token属性。 (预先self是分配属性所必需的;没有self,Ruby只会创建一个名为remember_token本地变量。)

答案 1 :(得分:0)

截至2018年,@remember_token具有访问器方法。

enter image description here

class User < ApplicationRecord
  attr_accessor :remember_token

  before_save { self.email = email.downcase }

  ...

# Remembers a user in the database for use in persistent sessions.
  def remember
    self.remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
  end

  ...

数据库中没有remember_token列。这是一个“虚拟”属性。记住标记作为remember_digest作为哈希存储。