添加用户代理& IP到存储的会话-RecordNotSaved -Rails

时间:2013-10-02 19:46:05

标签: ruby-on-rails ruby-on-rails-3 session save rollback

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

由于通过sessions_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 ....但是当保存到数据库时它只是回滚。 / p>

当我使用save!时,除了以下内容之外,我还在日志中收到了Completed 422 Unprocessable Entity(粘贴到gist以节省空间): https://gist.github.com/anonymous/8019c2426334f395a5fd

谢谢!任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:0)

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

我不确定为什么你的记录不能保存,但我会下注模型会话与rails冲突。通过相同的标记,当您创建请求表时,您应该给它一个唯一的名称,如SessionMeta和RequestMeta。然后SessionMeta可以有很多RequestMeta。