【问题标题】:Update activerecords in faye event listeners更新 faye 事件监听器中的 activerecords
【发布时间】:2012-07-18 04:11:01
【问题描述】:

我正在编写一个 Rails 应用程序,它需要跟踪用户的状态以查看他们是否可用、忙碌或离线。我正在使用 private_pub gem,它在下面使用 Faye。当用户登录时,他订阅频道 /user/[:user_id]。当他们使用 Faye 的订阅事件侦听器订阅时,我想将用户的状态更新为 ONLINE。我在 private_pub.ru 文件的末尾添加了这段代码:

server = PrivatePub.faye_app

server.bind :subscribe do |client_id, channel|
  if /\/user\/*/.match(channel)
      m = /\/user\/(?<user_id>\d+)/.match(channel)
      user_id = m[:user_id]
  end
  user = User.find(user_id)
  user.status = 1 # 1 means online
end

run server

问题是每次用户订阅时,瘦服务器都会报告:

[ERROR] [Faye::RackAdapter] uninitialized constant User

我想我需要某些文件才能在 rackup 文件中使用 activerecords。但我不知道怎么做。

感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails faye rackup


    【解决方案1】:

    在我们的项目中,我们决定将 redis 用于类似的情况。

    宝石文件:

    gem 'redis-objects'
    

    Faye:使用redis-rb写入状态

    require 'redis'
    Redis.current = Redis.new(:host => '127.0.0.1', :port => 6379)
    
    # init faye server
    ...
    
    server.bind(:subscribe) do |client_id, channel|
      if /\/user\/*/.match(channel)
        m = /\/user\/(?<user_id>\d+)/.match(channel)
        Redis.current.set("user:#{m[:user_id]}:online_status", "1")
      end
    end
    

    Rails:使用 redis-objects gem 在用户模型中读取它。

    class User < ActiveRecord::Base
      include Redis::Objects
      value :online_status
    end
    
    @user.online_status # returns "1" if channel is connected
    

    希望这会有所帮助。

    【讨论】:

    • 还是谢谢你,虽然它没有解决我的问题。但这非常有帮助。我现在也在用redis!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多