"Кто в сети" с помощью "Разработка в рельсах"
Используя Devise on Rails, есть ли способ указать всех пользователей, которые в настоящее время имеют активные сеансы, то есть пользователей, которые в настоящее время вошли в систему?
Ps. Я ищу надежное решение, а не что-то упрощенное, например, в этом вопросе
Ответы
Ответ 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.