Ruby on rails RubyonRails cookies[:记住你的令牌]和cookies[“记住你的令牌”之间的区别

Ruby on rails RubyonRails cookies[:记住你的令牌]和cookies[“记住你的令牌”之间的区别,ruby-on-rails,Ruby On Rails,我无法理解以下情况: 我通过以下操作登录并记住我的用户 class SessionsController < ApplicationController def create user=User.find_by(email: params[:session][:email]) if user && user.authenticate(params[:session][:password]) log_in(user) params

我无法理解以下情况:

我通过以下操作登录并记住我的用户

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
所有这些都很好。但我不明白的是,在集成测试中,我必须使用cookies[“记住令牌”],因为在以下情况下cookies[:记住令牌]将返回nil

test "login with remember_me" do
    log_in_as(@user)
    assert_not_nil cookies["remember_token"]
end
如果我将其用作Sessionhelper(例如user.authenticated?(cookies[:memory_token])内部函数中的参数,为什么它在这里返回nil,为什么不返回nil


注:以上所有代码都来自Michael Hartl的Ruby on Rails教程(第9.3.1章)

我想这是因为Ruby中的一切都是对象。

因此,如果哈希表中有这样一个对象:memore_token作为键,并且您正在请求键memore_token,那么这两个对象只是两个不同的对象。

这是因为在正常的应用程序中
cookies
方法返回
ActionDispatch::cookies::CookieJar
对象,它总是将cookie名称转换为字符串。在集成测试中,
cookies
方法返回不进行这种转换的
Rack::test::CookieJar
对象。所以,如果您通过symbol在测试中设置cookie,您需要通过symbol访问它。如果您通过字符串设置cookie,情况也是如此。

您有没有想过为什么HashWithInferenceAccess不在内部用于表示CookieJar类中的cookie?我找到了它做
@cookies[name.to\s]
的源代码。我能想到很多原因。这个类相当繁重,允许嵌套的哈希也充当HWIA。这在饼干中并不常见。也许还有性能方面的原因,比如对象分配的数量。我查看了ActiveSupport版本,其实现比我在考虑类实际提供的内容时预期的要复杂得多。
test "login with remember_me" do
    log_in_as(@user)
    assert_not_nil cookies["remember_token"]
end