4

我目前正在构建一个内部分析系统,用于跟踪访问者在每个会话中点击的位置,无论他们是登录到用户帐户还是没有帐户的访问者。

由于通过 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! 时,除了以下内容(粘贴到 gist 以节省空间)之外,我还在日志中收到 Completed 422 Unprocessable Entity: https ://gist.github.com/anonymous/8019c2426334f395a5fd

谢谢!任何帮助将不胜感激。

4

1 回答 1

0

我建议重新考虑您的架构。一个会话可以持续许多请求,并且您希望每个请求都有一个记录。还要注意您如何将数据从请求对象中移出并尝试将它们存储到会话表中。而是制作您自己的请求表并制作一个前置过滤器,将您想要的所有数据从请求对象移动到请求表。现在一个会话将有很多请求。

我不确定为什么您的记录没有保存,但是我敢打赌命名模型 Session 与 rails 冲突。同样的道理,当你创建你的请求表时,你应该给它一个唯一的名字,比如 SessionMeta 和 RequestMeta。那么 SessionMeta 可以有很多 RequestMeta。

于 2014-08-24T20:48:29.200 回答