मुझे actioncable के आसपास अपना सिर नहीं मिल रहा है। मैं उपयोगकर्ताओं को एक PostChannel की सदस्यता लेने की अनुमति देना चाहता हूं जो इस तरह दिखता है,

class PostNotificationsChannel < ApplicationCable::Channel

  def subscribed
    stream_from params[:post_id]
  end

  def unsubscribed
    stop_all_streams
  end
end

तब मेरे पास जेएस . है

/javascripts/channels/post_notifications.js

$(document).on('turbolinks:load', function() {
  $("a.post_subscribe").click(function subscribeToPost() {
  var post_id = $(this).parents("li").attr("class").split(" ")[0]; // Get the post id off the page
  App.post_notifications = App.cable.subscriptions.create({channel: "PostNotificationsChannel", post_id: post_id}, {

    connected: function() {},

    disconnected: function() {},

    received: function(data) {}
    });
  });
});

तो आप .post_subscribe एंकर टैग पर क्लिक करें और उसे उस पोस्ट की HTML क्लास की वैल्यू मिल जाती है जो मेरे पास पेज पर है, फिर उसका उपयोग सब्सक्रिप्शन क्रिएशन के पैरा हैश में करें। यह सब ठीक है और बांका है और जो उपयोगकर्ता इसे क्लिक करता है उसे उस पोस्ट पर कुछ कार्रवाई होने पर अपडेट प्राप्त होगा। लेकिन अगर आप पेज को रीफ्रेश करते हैं तो वह कनेक्शन उस उपभोक्ता को उस पोस्ट से दोबारा कनेक्ट नहीं कर सकता क्योंकि हैश में कोई पैरामीटर नहीं है। इसलिए, मैं सोच रहा हूं कि मैं इससे कैसे बाहर निकलूं।

साथ ही, रेल गाइड पेज पर भी यह इसे यहां दिखाता है ताकि वे पैराम पास कर रहे हैं लेकिन पेज रीलोड होने पर आप कनेक्शन कैसे रखते हैं?

1
Lee Eather 16 अक्टूबर 2018, 13:44

1 उत्तर

सबसे बढ़िया उत्तर

तो मैं आपके प्रश्न से जो समझता हूं, वह यह है कि जब कोई उपयोगकर्ता "सदस्यता" लिंक पर क्लिक करता है, तो आप चाहते हैं कि उपयोगकर्ता उस पोस्ट का अनुयायी बनें। इस उद्देश्य के लिए, आपको उपयोगकर्ता और पोस्ट के बीच एक अनुयायी के रूप में संबंध बनाकर इस जानकारी को डेटाबेस में संग्रहीत करना होगा। फिर जब भी उस पोस्ट पर कोई गतिविधि होती है, तो उस विशिष्ट पोस्ट के सभी अनुयायियों के नोटिफिकेशन स्ट्रीम में एक सूचना प्रसारित करें।

एक अधिसूचना चैनल बनाएं जिसमें प्रत्येक उपयोगकर्ता जब भी साइट पर लॉग इन करेगा तो उसकी सदस्यता ली जाएगी, उदाहरण के लिए आईडी 1 वाला उपयोगकर्ता लॉग इन करता है, उसे अधिसूचना स्ट्रीम की सदस्यता दी जाएगी जो प्रत्येक उपयोगकर्ता के लिए अद्वितीय होगी उदा। सूचित करें_उपयोगकर्ता_1_चैनल

class NotificationsChannel < ApplicationCable::Channel
  def subscribed
    if params[:recepient].present?
      stream_from "notify_#{params[:recepient]}_channel"
    end
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end
end

चैनल के लिए आपकी स्क्रिप्ट में,

App.chat = App.cable.subscriptions.create {
            channel: "NotificationsChannel"
            recepient: $('#recepient').data("recepient")
            }

और प्राप्तकर्ता को पैरामीटर के रूप में देने के लिए, कहीं कोड देखें, अधिमानतः पाद लेख में,

<div id="recepient" data-recepient="User_<%= current_user.id %>"></div>

और, अधिसूचना को एक स्ट्रीम में प्रसारित करने के लिए, अधिसूचना मॉडल के after_create_commit में,

ActionCable.server.broadcast "notify_#{notification.recepient_type}_#{notification.recepient_id}_channel"
1
Saqib Shahzad 17 अक्टूबर 2018, 09:13