如何将Activerecord对象与Em-Websocket连接相关联?

时间:2015-06-14 08:46:04

标签: ruby activerecord sinatra em-websocket

我是红宝石的新手。我正在尝试使用em-websocket实现聊天客户端。我有以下代码:

  EventMachine::WebSocket.start(host: '0.0.0.0', port: 8080) do |websock|
    websock.onopen do
      puts 'New Connection Opened'
      cookies = CGI::Cookie::parse( websock.request["cookie"])
      person = Person.where(['token = ?', cookies["token"]]).first
      unless person       
        websock.close(code = nil, body = {Error: "Invalid Token"}.to_json)  unless person
        return
      end
      puts "#{person.name} authenticated!"
      person=person.attributes.merge(websock.attributes) # this doesn't work
      # Subscribe the new user to the GrindServer.realtime_channel with the callback function for the push action
      new_user = GrindServer.realtime_channel.subscribe { |msg| websock.send msg }
      GrindServer.online_people << person
      # Add the new user to the user list
      @users[websock.object_id] = new_user

      # Push the last messages to the user
      # message.all.each do |message|
        # websock.send message.to_json
      # end
      # puts GrindServer.realtime_channel.inspect
      # Broadcast the notification to all users
      onlinepeople = []
      GrindServer.online_people.each do |onli|
        onlinepeople << person
      end

      # Send last 10 messages to the newly connected user
      websock.send Message.where({ receiver_id: [0, person.id}).last(10).to_json

      GrindServer.realtime_channel.push ({
        'id' => 0,
        'sender_id' => 0,
        'messagetext' => "#{person.name} joined. <$<^<#<#{@users.length}>#>^>$> users in chat",
        'users' => onlinepeople,
        'metadata' => websock.request["query"]["id"],
        }.to_json)
    end
  ...# other event handlers
  end

基本上我正在尝试维护Person(ActiveRecord对象)及其对应的WebSocket :: Connection对象的列表。

Server code

Migration

更新:即使我无法合并。我应该能够在websocket上附上一个注释,这个注释属于一个名为&#34; x&#34;?

的人

1 个答案:

答案 0 :(得分:0)

我通过使用哈希来解决它。

  EventMachine::WebSocket.start(host: '0.0.0.0', port: 8080) do |websock|
    websock.onopen do
      puts 'New Connection Opened'
      cookies = CGI::Cookie::parse( websock.request["cookie"])
      person = Person.where(['token = ?', cookies["token"]]).first
      unless person       
        websock.close(code = nil, body = {Error: "Invalid Token"}.to_json)  unless person
        return
      end
      puts "#{person.name} authenticated!"
      # person=person.attributes.merge(websock.attributes)
      # Subscribe the new user to the GrindServer.realtime_channel with the callback function for the push action
      new_user = GrindServer.realtime_channel.subscribe { |msg| websock.send msg }
      GrindServer.online_people << {:ws_oid => websock.object_id,
                                    :websocket => websock, 
                                    :person_name => person.name,
                                    :person_trigram => person.trigram} # this solves it
      # Add the new user to the user list
      @users[websock.object_id] = new_user

      onlinepeople = []
      GrindServer.online_people.each do |onli|
        onlinepeople << onli.except(:websocket)
      end

      # Send last 10 messages to the newly connected user
      websock.send Message.where({ receiver_id: [0, person.id]}).last(10).to_json

      GrindServer.realtime_channel.push ({
        'id' => 0,
        'sender_id' => 0,
        'messagetext' => "#{person.name} joined. <$<^<#<#{@users.length}>#>^>$> users in chat",
        'users' => onlinepeople,
        'metadata' => person.trigram,
        }.to_json)
    end