只有当你在会话中存储一些东西时,你才会得到session.id
,否则它是nil
.在第一个请求中,会话中还没有存储任何内容.在您的控制器操作完成之后,Rails存储_csrf_token
和SOsession_id
也被存储.只需带走:
<%= csrf_meta_tags %>
从您的布局和session.id
将永远不会被初始化(除非您有其他更新会话).
会话ID是nothing特殊的,但您可能应该为此创建您自己的密钥:
# it's what session id is anyway
session[:cache_id] ||= SecureRandom.hex(16)
您还可以将某些内容保存到会话中,id
将进行初始化:
# assuming there is no session
cookies.clear
session.id #=> nil
# any one of these will initialize session id
session.update({})
session.send(:load!)
session[:touch] = "poke"
# or this
session.destroy
session.clear
session.id #=> "cc3363adc0831258d3173f207a62dcae"
就测试而言,它只是向您显示session.id
不是缓存ID的可靠来源.从一开始就把它固定在控制器上.
class HomeController < ApplicationController
def index
p "this does not initialize session.id"
p Rails.cache.fetch(session.id) { Hash.new }
p session.id # still nil
p
p "this will initialize session"
p session.update({}) # or any other way mentioned above
p Rails.cache.fetch(session.id) { Hash.new }
p session.id
end
end
$ bin/rails test test/controllers/home_controller_test.rb
Running 1 tests in a single process (parallelization threshold is 50)
Run options: --seed 48575
# Running:
"this does not initialize session.id"
{}
nil
"this will initialize session"
{"session_id"=>"39c1ee00e1e9214250d0bb6cfbfa68dc"}
{}
"39c1ee00e1e9214250d0bb6cfbfa68dc"
.
Finished in 0.294108s, 3.4001 runs/s, 3.4001 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
这就像是第一次访问页面.try 在隐姓埋名窗口,session.id
将是nil
,但只是第一次访问.在测试中,它总是第一次访问.