Подтвердить что ты не робот

"Кто в сети" с помощью "Разработка в рельсах"

Используя Devise on Rails, есть ли способ указать всех пользователей, которые в настоящее время имеют активные сеансы, то есть пользователей, которые в настоящее время вошли в систему?

Ps. Я ищу надежное решение, а не что-то упрощенное, например, в этом вопросе

4b9b3361

Ответ 1

https://github.com/ctide/devise_lastseenable

Вы можете использовать этот драгоценный камень, который я написал, чтобы сохранить метку времени "last_seen" пользователя. Оттуда довольно тривиально отображать пользователей, которые были last_seen за последние 5 или 10 минут.

Ответ 2

Просто добавьте after_filter в ApplicationController

after_filter :user_activity

private

def user_activity
  current_user.try :touch
end

Затем в пользовательской модели добавьте онлайн? Метод

def online?
  updated_at > 10.minutes.ago
end

Также вы можете создавать область

scope :online, lambda{ where("updated_at > ?", 10.minutes.ago) }

Ответ 3

Если вам мешает совершить поездку в базу данных по каждому. Один. HTTP. запрос. только иметь небольшое окно, где вы можете предположить, что пользователь подключен к сети; У меня есть альтернативное решение.

С помощью websockets и redis можно надежно получить статус онлайн-пользователя до миллисекунды без внесения миллиарда дорогостоящих записей на диск. К сожалению, это требует хорошей работы и имеет две дополнительные зависимости, но если кто-то заинтересован, я сделал довольно подробную запись здесь:

Как узнать, находится ли пользователь в сети?

Ответ 4

Я только что реализовал другую версию этого и подумал, что буду делиться, если это поможет кому-то еще.

Я просто добавляю столбец last_sign_out_at в таблицу моих пользователей, а затем подклассифицировал контроллер сессий Devise, чтобы я мог переопределить метод destroy, чтобы установить его, когда сеанс уничтожается (пользователь выдает сигнал):

# app/controllers

class SessionsController < Devise::SessionsController

  def destroy
    current_user.update_attribute(:last_sign_out_at, Time.now)
    super
  end

end

И затем в моей модели User у меня есть способ проверить, находится ли пользователь в сети:

class User < ActiveRecord::Base

  def online?
    if current_sign_in_at.present? 
      last_sign_out_at.present? ? current_sign_in_at > last_sign_out_at : true
    else
      false
    end
  end

end

Также вам нужно сказать Devise, чтобы использовать новый контроллер Session в ваших маршрутах.

Ответ 5

Мы можем перечислить текущие активные сеансы, используя хранилище сеансов активной записи. Посмотрите страницу приложения github https://github.com/mohanraj-ramanujam/online-users.