2015-10-02 6 views
12

मैं एक्शन केबल के साथ एक साधारण चैट-जैसी एप्लिकेशन (योजना पोकर ऐप) बनाने की कोशिश कर रहा हूं। मैं शब्दावली, फाइल पदानुक्रम और कॉलबैक कैसे काम करता हूं, द्वारा थोड़ा उलझन में हूं।एक्शनकेबल - कनेक्ट किए गए उपयोगकर्ताओं की संख्या कैसे प्रदर्शित करें?

class SessionsController < ApplicationController 
    def create 
    cookies.signed[:username] = params[:session][:username] 
    redirect_to votes_path 
    end 
end 

फिर एक उपयोगकर्ता एक वोट है कि हर किसी के लिए प्रसारित किया जाना चाहिए पोस्ट कर सकते हैं:

यह क्रिया है कि उपयोगकर्ता सत्र बनाता है

class VotesController < ApplicationController 
    def create 
    ActionCable.server.broadcast 'poker', 
           vote: params[:vote][:body], 
           username: cookies.signed[:username] 
    head :ok 
    end 
end 

इस बिंदु सब कुछ अप करने के लिए मेरे लिए स्पष्ट है और ठीक काम करता है। समस्या यह है कि - मैं कनेक्ट किए गए उपयोगकर्ताओं की संख्या कैसे प्रदर्शित करूं? क्या कोई कॉलबैक है जो जेएस में आग लगती है जब उपयोगकर्ता (उपभोक्ता?) कनेक्ट होता है? मैं चाहता हूं कि जब मैं गुप्त मोड में 3 अलग-अलग ब्राउज़रों में 3 टैब खोलूं तो मैं "3" प्रदर्शित करना चाहता हूं। जब कोई नया उपयोगकर्ता कनेक्ट होता है, तो मैं संख्या को बढ़ाना चाहता हूं। यदि कोई उपयोगकर्ता डिस्कनेक्ट करता है, तो संख्या में कमी होनी चाहिए।

मेरे PokerChannel:

class PokerChannel < ApplicationCable::Channel 
    def subscribed 
    stream_from 'poker' 
    end 
end 

app/assets/javascripts/poker.coffee:

App.poker = App.cable.subscriptions.create 'PokerChannel', 

    received: (data) -> 
    $('#votes').append @renderMessage(data) 

    renderMessage: (data) -> 
    "<p><b>[#{data.username}]:</b> #{data.vote}</p>" 

उत्तर

16

लगता है कि एक ही रास्ता

ActionCable.server.connections.length 
+3

ध्यान दें कि यह * विशिष्ट थ्रेड * के लिए कनेक्शन की वर्तमान संख्या है, इसे विभिन्न प्रक्रियाओं और धागे पर कनेक्शन की संख्या नहीं है – edwardmp

+1

यह सर्वर के कनेक्शन की संख्या भी है, एक विशिष्ट चैनल के लिए नहीं । – Matt

1

उपयोग करने के लिए एक त्वरित (और शायद आदर्श नहीं) समाधान आप लिख सकते हैं के लिए है एक मॉड्यूल जो सदस्यता गणना ट्रैक करता है (डेटा स्टोर करने के लिए रेडिस का उपयोग करके):

#app/lib/subscriber_tracker.rb 
module SubscriberTracker 
    #add a subscriber to a Chat rooms channel 
    def self.add_sub(room) 
    count = sub_count(room) 
    $redis.set(room, count + 1) 
    end 

    def self.remove_sub(room) 
    count = sub_count(room) 
    if count == 1 
     $redis.del(room) 
    else 
     $redis.set(room, count - 1) 
    end 
    end 

    def self.sub_count(room) 
    $redis.get(room).to_i 
    end 
end 

और आपके सदस्यता और चैनल कक्षा में सदस्यता रद्द कर दी विधि अपडेट:

Redis.new.pubsub("channels", "action_cable/*") 

और यदि:

class ChatRoomsChannel < ApplicationCable::Channel 
    def subscribed 
    SubscriberTracker.add_sub params['room_id'] 
    end 

    def unsubscribed 
    SubscriberTracker.remove_sub params['chat_room_id'] 
    end 
end 
1

एक संबंधित question on who is connected में, वहाँ जो redis का उपयोग करता है उन लोगों के लिए एक जवाब था आप बस कनेक्शन की संख्या चाहते हैं:

Redis.new.pubsub("NUMPAT", "action_cable/*") 

यह आपके सभी सर्वरों से कनेक्शन सारांशित करेगा।

रिमोटकनेक्शन कक्षा और आंतरिक चैनल मॉड्यूल के अंदर सभी जादू शामिल हैं।

टीएल; डीआर सभी कनेक्शन मुख्य चैनल ऐप से डिस्कनेक्ट करने वाले सॉकेट के केवल उद्देश्य के साथ एक उपसर्ग action_cable/* के साथ विशेष चैनलों पर subscibed।

संबंधित मुद्दे