"Кто в сети", используя Devise в Rails - PullRequest
40 голосов
/ 31 марта 2011

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

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

Ответы [ 5 ]

84 голосов
/ 15 декабря 2011

Просто добавьте 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) }
24 голосов
/ 31 марта 2011

https://github.com/ctide/devise_lastseenable

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

20 голосов
/ 28 января 2014

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

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

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

1 голос
/ 01 февраля 2013

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

Я просто добавляю столбец last_sign_out_at в свою таблицу Users, а затем делаю на подклассы контроллер сессий 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 использовать новый контроллер Sessions в ваших маршрутах.

0 голосов
/ 15 июля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...