2016-08-26 15 views
9

मैंने वेब को बहुत दूर और व्यापक खोजा है (ActionCable के लिए कई कोड उदाहरणों को पढ़ने सहित) जो कि एक बहुत ही बुनियादी प्रश्न का उत्तर है । हां, मैंने अपनी समस्या हल नहीं की है।रेल पर रूबी 5 एक्शन केबल: वर्तमान मॉडल इंस्टेंस (यूआरएल-आधारित सब्सक्रिप्शन) के लिए स्ट्रीम

मान लीजिए, मेरे पास एक मॉडल Search है और मैंने URL /searches/1 पर नेविगेट किया है।

App.instance = App.cable.subscriptions.create 'SearchChannel' 

और एक SearchChannel वर्ग कि इस तरह दिखता है:

मैं भी javascripts/channels/ जो साथ शुरू होता है के तहत search.coffee फ़ाइल होता

class SearchChannel < ApplicationCable::Channel 
    def subscribed 
    search = Search.find(params[:id]) 
    stream_for search 
    end 

    def unsubscribed 
    end 
end 

स्वाभाविक रूप से, कोड ऊपर एक त्रुटि पैदा करता है क्योंकि params[id]nil है।

यहाँ मेरी प्रश्न हैं:

  • मैं कैसे सही Search उदाहरण URL के आधार पर करने के लिए सदस्यता करते हैं?
  • मैं SearchChannel पर सब्सक्राइब करने का प्रयास करने से कैसे बचूं यदि मैं किसी अन्य URL पर हूं जिसके लिए सदस्यता की आवश्यकता नहीं है, उदा। /searches/1/results?

मदद के लिए धन्यवाद!

उत्तर

1

यदि आप ActionCable.Subscriptions#create के कार्यान्वयन को देखते हैं, तो इसे दो तरीकों से बुलाया जा सकता है।

(CHANNELNAME साथ) विकल्प 1:

App.cable.subscriptions.create 'SearchChannel' 

विकल्प 2 (चैनल वस्तु के साथ):

App.cable.subscriptions.create channel: 'SearchChannel', id: 'Best Room' 

आप विकल्प 1 के साथ जाना है, तो आंतरिक रूप से, यह में परिवर्तित हो जाती चैनल ऑब्जेक्ट।

इसलिए, यदि आप सर्वर साइड पर id कैप्चर करना चाहते हैं, तो आप 2 विकल्प का उपयोग और search की id उत्तीर्ण करने की आवश्यकता है, तो आप के रूप में आप वर्णित सर्वर साइड पर यह कब्जा करने के लिए सक्षम होना चाहिए:

class SearchChannel < ApplicationCable::Channel 
    def subscribed 
    search = Search.find(params[:id]) 
    stream_for search 
    end 

    def unsubscribed 
    end 
end 

अधिक जानकारी के लिए Client-Server Interactions and Subsciptions का संदर्भ लें।

+1

आपके उत्तर के लिए धन्यवाद, लेकिन यह मेरी मदद नहीं करता है। मैंने दस्तावेज में इस विकल्प के बारे में पहले से ही पढ़ा था, लेकिन जो मैं उलझन में हूं, वह विशेष रूप से 'आईडी' को 'सर्चचैन' में भेजना है। रेल 'जावास्क्रिप्ट/चैनल /' के तहत 'search.coffee' डालता है, जिसका अर्थ है कि मुझे उस आईडी से कहीं उस आईडी को पास करने की आवश्यकता है। यही वह जगह है जहां मेरी कठिनाई झूठ बोलती है। – Vadim

+2

मुझे पूरा यकीन नहीं है कि आप 'SearchChannel' सदस्यता के साथ क्या हासिल करने का प्रयास कर रहे थे। लेकिन अगर आपको रूबी पक्ष से जावास्क्रिप्ट पक्ष में '@ search.id' को कैप्चर करने की आवश्यकता है, तो आपके पास कई विकल्प हैं। विकल्प 1: जब आप '/ search/1' url पर हों, तो आप जावास्क्रिप्ट में यूआरएल पार्स कर सकते हैं और 'id' को url से' App.cable.subscriptions.create' तक पास कर सकते हैं। विकल्प 2: 'शो' टेम्पलेट के प्रमुख में, 'id' को जावास्क्रिप्ट में संग्रहीत करें, पूर्व में: <% = javascript_tag "var search_id = # {params [: id]}"%> और' search_id' को ' App.cable।subscriptions.create'। उम्मीद है की वो मदद करदे। – Dharam

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