我遇到以下情况时遇到了麻烦:
我通过执行以下操作登录并记住我的用户
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章)
答案 0 :(得分:4)
这是因为在正常的应用程序cookies
方法中返回ActionDispatch::Cookies::CookieJar
对象,该对象始终将cookie名称转换为字符串。在集成测试中,cookies
方法会返回不进行此类转换的Rack::Test::CookieJar
对象。因此,如果您通过符号在测试中设置cookie,则需要通过符号访问它。如果你通过字符串设置你的cookie,也是如此。
答案 1 :(得分:0)
我想这是因为ruby中有一个对象 因此,如果哈希表具有对象:remember_token 作为键,并且您要求键 remember_token 那么这两个就是两个不同的对象。