Hop*_*eam 24 ruby ruby-on-rails devise ruby-on-rails-3 ruby-on-rails-4
我正在使用设计存储current_sign_in_at和last_sign_in_at日期时间.
但是,让我们说用户在一个月前登录但是上次在5分钟前查看了一个页面?
有没有办法可以显示("用户上次见过5分钟前").
dch*_*cke 47
这个怎么样:
创建迁移以向用户添加新字段以存储上次用户的日期和时间:
rails g migration add_last_seen_at_to_users last_seen_at:datetime
Run Code Online (Sandbox Code Playgroud)向应用程序控制器添加before action回调:
before_action :set_last_seen_at, if: proc { user_signed_in? }
private
def set_last_seen_at
current_user.update_attribute(:last_seen_at, Time.current)
end
Run Code Online (Sandbox Code Playgroud)这样,在当前用户执行的每个请求(即活动)上,他/她最后一次看到的属性被更新为当前时间.
但请注意,如果您有许多用户登录,这可能会占用您应用程序的部分资源,因为这将在登录的某个人请求的每个控制器操作之前执行.
如果需要考虑性能,请考虑在步骤2中添加以下节流机制(在此示例中,在15分钟时进行限制):
before_action :set_last_seen_at, if: proc { user_signed_in? && (session[:last_seen_at] == nil || session[:last_seen_at] < 15.minutes.ago) }
private
def set_last_seen_at
current_user.update_attribute(:last_seen_at, Time.current)
session[:last_seen_at] = Time.current
end
Run Code Online (Sandbox Code Playgroud)
为了提高前一个答案的表现:
update_attribute运行回调和更新updated_at属性,而update_column不是更新的代码:
before_action :set_last_seen_at, if: proc { user_signed_in? && (user.last_seen_at.nil? || user.last_seen_at < 15.minutes.ago) }
private
def set_last_seen_at
current_user.update_column(:last_seen_at, Time.now)
end
Run Code Online (Sandbox Code Playgroud)
Devise插件会发生类似的行为(刚刚见过,没有优化):https://github.com/ctide/devise_lastseenable
| 归档时间: |
|
| 查看次数: |
7117 次 |
| 最近记录: |