【问题标题】:Hartl Rails tutorial chapter 8: How does remember_token work?Hartl Rails 教程第 8 章:remember_token 是如何工作的?
【发布时间】:2012-10-10 03:33:44
【问题描述】:

在 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 中包含这个?

【问题讨论】:

    标签: attributes token railstutorial.org


    【解决方案1】:

    截至 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 的哈希值。

    【讨论】:

      【解决方案2】:

      在此上下文中,self 是一个用户对象,它具有remember_token 属性,因为Ruby on Rails TutorialSection 8.2.1 中的迁移创建的数据库列。 (在前面加上self 是分配给属性所必需的;没有self,Ruby 只会创建一个名为remember_token本地 变量。)

      【讨论】:

      • 我明白了。那么迁移创建的属性和添加到 attr_accessible 是一样的吗?谢谢!
      • 当我在控制台输入 self 时,我得到“main”。我想我应该在这之后读那本红宝石书。
      • 所有由迁移创建的属性可通过 Active Record 自动使用,但它们不能通过批量分配更改,除非是 attr_accessible 列表的一部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      相关资源
      最近更新 更多