【问题标题】:storing the number of user visits with Devise in Rails在 Rails 中使用 Devise 存储用户访问次数
【发布时间】:2012-11-21 21:03:32
【问题描述】:

我想跟踪用户访问网站的次数。如果先前的访问时间超过 30 分钟,则访问计数器(用户模型的一部分)会增加。我正在使用 Rails 和设计:

class ApplicationController < ActionController::Base
  before_filter :authenticate_user!
  before_filter :update_visits

  def update_visits
    current_user.increment!(:visits) if !current_user.nil? && current_user.updated_at < 30.minutes.ago
  end
end

这会很好用,除非我设计了 :rememberable 已打开。所以来自 :authenticate_user 的 SQL 调用序列!这是:

SELECT "users".* FROM "users" WHERE "users"."email" = 'person_1@example.com' LIMIT 1

UPDATE "users" SET "remember_created_at" = '2012-11-21 20:13:53.011322',“updated_at”='2012-11-21 20:13:53.012791' "用户"."id" = 1

因此,visits 变量永远不会增加,因为 updated_at 在可记忆调用中设置为当前时间。如何在身份验证之后但在可记住之前调用 update_visits?

谢谢

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    我认为你的任务不是那么简单。如果您有记忆,您应该跟踪用户的活动,而不是通过登录。应该有一个标准设置你称之为“活动”:它只是返回到应用程序的页面还是点击链接或按钮。在Railscast 关于从头开始的身份验证中,身份验证背后有一个逻辑。大概会有解决办法吧?就像在为 current_user 检查会话时设置回调一样。

    编辑:看看this discusion。有多种方法可以通过Warden::Manager 跟踪当前用户的身份验证请求时间。

    【讨论】:

    • 是的,这将是一种扩展解决方案。目前,我只想让网站上的任何用户活动触发“updated_at
    • 谢谢,我最终还是使用了warden:manager 来解决它。我发布了我的代码。
    • 这真是太棒了。我同时启动了相同的应用功能。
    【解决方案2】:

    我使用 Warden 来解决这个问题。

    initializers/devise.rb:

    Warden::Manager.after_set_user do |user,auth,opts|
      user.increment(:visits).save! if user.updated_at < 30.minutes.ago
    end
    

    【讨论】:

      猜你喜欢
      • 2016-10-05
      • 2012-05-20
      • 2011-04-30
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多