Rails 4 session.id 偶尔为零

Posted

技术标签:

【中文标题】Rails 4 session.id 偶尔为零【英文标题】:Rails 4 session.id occasionally nil 【发布时间】:2015-08-26 16:09:27 【问题描述】:

我在 Heroku 上运行一个简单的网站,我注意到在运行应用程序时发生了一些奇怪的事情。似乎大约 50-60% 的用户在登录我的数据库时报告了 nil session_id。

我使用 active_record_store 作为会话处理程序,使用 Postgres 作为我的数据库服务器。我使用 cookie_store 得到了类似的结果,所以我不确定我做错了什么。我唯一的猜测是用户提出的第一个请求,id 可能尚未填充。会话表的条目数正确,但我的跟踪表没有。

示例代码

class CaptionController < ApplicationController

  def index

    @image = Image.order("RANDOM()").first
    Tracking.log(session.id, Tracking::VIEW_CAPTION_ON_IMAGE, @image.id)

  end

上面的代码导致 50% 的时间,会话在它记录到的表中为零。

【问题讨论】:

你看到的和你设置@image的方式一样吗?你在哪里设置/检索session 根据 Rails 4 API,这是由 Controller 预先设置的。我正在查看***.com/questions/26754239/rails-4-1-6-session-id 以供参考。 【参考方案1】:

我找到了答案,看起来 Rails 试图通过仅在有东西要存储时才创建会话来提高效率。因此访问 session.id 而不存储内容不会返回一致的结果。

您需要通过在其中存储一些内容来强制创建会话。

TLDR:在访问会话 ID 之前将其添加到某处。

session[:foo] = "bar"

来源http://www.gani.com.au/2013/08/force-session-creation-in-rails/

【讨论】:

这不是一个错误,而是所有版本的 Rails 中 cookie 会话存储的一个可疑“功能”。如果 cookie 不存在(第一次访问站点或已删除 cookie),则会话将为空,因此会话 ID 将为 nil。

以上是关于Rails 4 session.id 偶尔为零的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4.0.0到4.1.0升级会导致错误的参数错误

Rails 项目中不断自动加载的问题(偶尔工作)

Ruby on Rails 中的会话如何工作?

Rails:无法将图像解析为 URL:to_model 委托给附件,但附件为零 Rails 5.2

在 github 操作上运行测试时,Rails 凭证值为零

当我在 SE 中向上滚动时,自定义 UITableViewCell 中的 UItextfield 文本打印为零