了解 Rails 中新会话何时开始

use*_*550 5 session ruby-on-rails

我将从描述一个场景开始,我对其他方法持开放态度,但我想不出任何其他方法。

我在 Rails 2 应用程序上有匿名用户。当新用户访问该网站时,我想放置一个 cookie,显示“我已访问该网站 1 次”,并将其记录在我们的系统中。用户离开并在一个月后回来,我读取此 cookie,增加访问次数(“我来过这里 2 次”)并将其记录在我们的系统中。

我的计划:

当新会话开始时

  • 如果用户是新用户 - 创建 cookie,记录访问
  • 如果用户返回 - 读取 cookie、增加值、写入 cookie、记录访问

我现在陷入困境的是“当新会话开始时”步骤。如果您有 .net 背景,我正在寻找相当于 ASP.NET 中的 Session_Start 的功能。我可以针对每个请求查询数据库,并检查特定会话 ID 是否已被记录,但这似乎效率低下。

Bef*_*ffa 1

事实上这是一个坏主意。Rails 将会话存储在数据库或文件系统(tmp/sessions)中。如果您想知道用户之前是否在该页面上,您只需不要删除会话(会话不会过期)。但随后会话的数量将无限增长。

如果用户使用相同的浏览器返回同一台计算机,则会话仍将存在。在您的应用程序/会话控制器中,您可以执行以下操作:

session[:visits] ||= 0
session[:visits] += 1
Run Code Online (Sandbox Code Playgroud)

但每次点击它都会增加。因此,如果您只想计算访问次数,则还需要存储上次单击的时间,并且如果用户离开超过半小时左右,则只需递增。

session[:visits] ||= 0
now = DateTime.now.to_i
session[:visits] += 1 if session[:last_click] && session[:last_click] < (now - 60*30)
session[:last_click] = DateTime.now.to_i
Run Code Online (Sandbox Code Playgroud)

这仍然是一个坏主意,因为如果用户返回到不同的浏览器或计算机,计数器将再次启动。(有关会话的更多信息:http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec :sessions)