我目前正在构建一个内部分析系统,该系统可以跟踪访问者在每个会话中的点击位置,无论他们是登录到用户帐户还是没有帐户的访问者。
由于通过session_store.rb进行的更改,我目前将会话保存到数据库中,但是,除了session_id之外,我还试图弄清楚如何在会话表中同时添加UserAgent详细信息和访问者的IP。
我尝试了几种解决方案,但都失败了-我当前的解决方案似乎是最接近的,但是在更新Session的属性后,我仍然遇到ActiveRecord :: RecordNotSaved错误。
我目前在应用程序控制器中使用前置过滤器:
before_filter :set_useragent_and_ip_in_session
def set_useragent_and_ip_in_session
if session
sess = request.session_options[:id]
@session = Session.where(session_id: sess).first
@session.update_attributes(:ip=>request.remote_ip, :user_agent=>request.user_agent)
@session.save!
else
end
end
我在视图中插入了一条调试语句,并在pry中播放了代码-@session有效并正确显示了@ session.user_agent ....但是,保存到数据库时,它只会回滚。
当我使用save!时,除了以下内容外,我还在日志中收到“已完成422无法处理的实体”(已粘贴到要点以节省空间):
https://gist.github.com/anonymous/8019c2426334f395a5fd
谢谢!任何帮助将不胜感激。
最佳答案
我建议重新考虑您的架构。一个会话可以持续许多请求,并且您希望每个请求都有一条记录。还要注意如何将数据从请求对象中移出并将其存储到会话表中。而是创建您自己的请求表,并创建一个before过滤器,该过滤器将您想要的所有数据从请求对象移至请求表。现在,一个会话将有许多请求。
我不确定为什么您的记录没有保存,但是我敢说命名模型Session与Rails冲突。同样,当您创建请求表时,应该给它一个唯一的名称,例如SessionMeta和RequestMeta。然后,SessionMeta可以有许多RequestMeta。