【问题标题】:Ruby on Rails difference between cookies[:remember_token] and cookies["remember_token"]Ruby on Rails cookie[:remember_token] 和 cookies["remember_token"] 的区别
【发布时间】:2016-12-28 01:25:29
【问题描述】:

我无法理解以下情况:

我正在登录并通过执行以下操作记住我的用户

class SessionsController < ApplicationController

  def create
    user=User.find_by(email: params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      log_in(user)
      params[:session][:remember_me]=="1" ? remember(user) : forget(user)
      redirect_to user
    else
      flash.now[:danger]="Invalid email/password combination"
      render "new"
    end
  end

module SessionsHelper

    def remember(user)
        user.remember
        cookies.permanent.signed[:user_id]=user.id
        cookies.permanent[:remember_token]=user.remember_token
    end

所有这些都可以正常工作。不过我不明白的是,在集成测试中我必须使用 cookies["remember_token"] 因为在以下情况下 cookies[:remember_token] 将返回 nil

test "login with remember_me" do
    log_in_as(@user)
    assert_not_nil cookies["remember_token"]
end

如果我将它用作例如 Sessionhelper 内部函数中的参数(例如 user.authenticated?(cookies[:remember_token]) ),为什么它在这里返回 nil 以及为什么不这样做p>

P.S.:以上所有代码均来自 Michael Hartl https://www.railstutorial.org/book 的 Ruby on Rails 教程(第 9.3.1 章)

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    这是因为在普通应用程序中,cookies 方法返回 ActionDispatch::Cookies::CookieJar 对象,该对象总是将 cookie 名称转换为字符串。在集成测试中,cookies 方法返回不进行此类转换的 Rack::Test::CookieJar 对象。因此,如果您通过符号在测试中设置 cookie,则需要通过符号访问它。如果您通过字符串设置 cookie,也是如此。

    【讨论】:

    • 关于为什么内部不使用 HashWithIndifferentAccess 来表示 CookieJar 类中的 cookie 有什么想法吗?我找到了它的来源@cookies[name.to_s]
    • 我能想到很多原因。这个类非常重,并且允许嵌套散列也充当 HWIA。这在 cookie 中并不常见。也许还有性能原因,比如对象分配的数量。
    • 是的。我去看了 ActiveSupport 版本,在考虑该类实际提供的内容时,实现比我预期的要复杂得多。
    【解决方案2】:

    我猜这是因为 ruby​​ 中的一切都是对象。
    因此,如果哈希表将对象 :remember_token 作为键并且您要求键 remember_token 这两个只是两个不同的对象。

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 2013-02-24
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多