Ruby on Rails在cookies [:remember_token]和cookies [“remember_token”]之间的区别

时间:2016-08-21 11:09:05

标签: 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[: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

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

我想这是因为ruby中有一个对象 因此,如果哈希表具有对象:remember_token 作为键,并且您要求键 remember_token 那么这两个就是两个不同的对象。