1

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

  private

    def create_remember_token
        self.remember_token = SecureRandom.urlsafe_base64
    end

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

他写:

由于 Active Record 基于数据库列合成属性的方式,没有 self 赋值会创建一个名为 remember_token 的局部变量,这根本不是我们想要的。使用 self 可确保赋值设置用户的 remember_token 以便在保存用户时将其与其他属性一起写入数据库。

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

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

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

那里没有关于 remember_token 的内容。它怎么知道在 User.save 中包含这个?

4

2 回答 2

1

在此上下文中,self是一个 User 对象,并且它具有属性,因为在Ruby on Rails 教程的第 8.2.1 节remember_token中迁移创建的数据库列。(预先分配给属性是必要的;没有,Ruby 只会创建一个名为 的局部变量。)selfselfremember_token

于 2012-10-19T16:44:41.203 回答
0

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

https://www.railstutorial.org/book/advanced_login#code-user_model_remember

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

于 2018-06-19T16:27:23.937 回答