2011-05-22 47 views
4

我会从描述一个场景开始,我会接受其他方式来做这件事,但我想不出任何其他方式。知道什么时候在Rails中启动一个新的会话

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

我的计划:

当一个新的会话开始

  • 如果用户是新的 - 创建的cookie,记录访问
  • 如果用户正在恢复 - 读取Cookie,增加值,写cookie,日志访问

我现在被卡住的地方是在“新会话开始时”步骤。如果你有.net背景,我正在寻找的是ASP.NET中Session_Start的等价物。我可能查询每个请求上的数据库,并检查是否已经记录了一个特定的会话ID,但这似乎效率低下。

+0

但是rails会随机设置session_id,那么如何告诉guest用户你被访问了2次? – Arun 2011-05-22 07:31:01

+0

session_id在每个请求中都不是随机的。我想知道什么时候开始新的会议,这将是理想的。如果没有,我将不得不将当前的session_id与记录的会话ID列表进行比较。我宁愿不这样做。 – user140550 2011-05-22 16:02:00

回答

1

其实这是一个坏主意。 Rails将会话存储在数据库或文件系统中(tmp/sessions)。如果你想知道,如果用户之前在页面上,你只是不要删除会话(没有会话过期)。但是届时会议的数量将会增长到无限。

如果用户使用相同的浏览器在同一台机器上返回,则会话将仍然存在。在你的应用程序/会话控制器,你可以这样做:

session[:visits] ||= 0 
session[:visits] += 1 

但随后它会随着每次点击而增加。因此,如果您只想计算访问次数,则需要存储最后一次点击时间,如果用户离开了半个多小时左右,则只需增加。

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 

仍然是一个糟糕的主意,因为如果在不同的浏览器或计算机的用户返回时,计数器将重新开始。 (关于会话的更多信息:http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec:sessions

+0

最终以cookies而不是会话的方式做了这样的事情。 – user140550 2011-05-25 19:18:08

相关问题