नोटिसेड और केबलरेडी के साथ रेल में मजबूत सिस्टम नोटिफिकेशन लागू करना
<पी> यह लेख आंशिक रूप से लेखक की एडवांस्ड केबलरेडी पुस्तक के आगामी अध्याय से प्रेरित है, और ऐपसिग्नल के लिए इस अतिथि पोस्ट को फिट करने के लिए तैयार किया गया है। <पी> सूचनाएं कई वेब अनुप्रयोगों द्वारा साझा की जाने वाली एक विशिष्ट क्रॉस-कटिंग चिंता है। <पी> नोटिस किया गया रत्न आपके रूबी ऑन रेल्स एप्लिकेशन के लिए डेटाबेस-समर्थित मॉडल और प्लग करने योग्य डिलीवरी विधियां प्रदान करके सूचनाओं को विकसित करना बेहद आसान बनाता है। यह मेलर्स, वेबसॉकेट और कुछ अन्य डिलीवरी विधियों के लिए अंतर्निहित समर्थन के साथ आता है। <पी> हम आपके रूबी ऑन रेल्स एप्लिकेशन में सिस्टम नोटिफिकेशन को ट्रिगर करने के लिए केबलरेडी रत्न का उपयोग करने की खूबियों की भी जांच करेंगे। <पी> आइए इसमें शामिल हों! आवश्यकताएँ और आवश्यकताएँ
<पी> समय-समय पर, आपको अपने ऐप से सिस्टम नोटिफिकेशन ट्रिगर करने की आवश्यकता हो सकती है। आप इसे नोटिफिकेशन एपीआई के साथ हासिल कर सकते हैं। <पी> उदाहरण के लिए, मान लें कि आपका एप्लिकेशन उपयोगकर्ताओं को बड़ी फ़ाइलें अपलोड करने की अनुमति देता है जिन्हें ट्रांसकोड होने में लंबा समय लगता है। वीडियो अपलोड पूरा होने के बाद आप उपयोगकर्ताओं को एक सूचना भेजना चाह सकते हैं। इसका मतलब है कि वे इस बीच एक नए कार्य पर स्विच कर सकते हैं और आपके एप्लिकेशन को कई मिनट तक खुला नहीं रखना होगा। <पी> सौभाग्य से, इन दो शर्तों के साथ सिस्टम नोटिफिकेशन को लागू करना और बेहतर बनाना आसान है: - नोटिस्ड में कस्टम डिलीवरी विधियों के लिए समर्थन है (नोटिस्ड आपकी पसंद के किसी भी परिवहन तंत्र को लागू करने के लिए एक सरल एपीआई को उजागर करता है - उदाहरण के लिए, डिस्कॉर्ड सर्वर पर पोस्ट करना)।
- CableReady के तरकश में एक अधिसूचना ऑपरेशन तीर है।
<पी> CableReady और Notesed के लिए आवश्यकताओं की सूची छोटी है - आपको बस निम्नलिखित की आवश्यकता है: - एक एक्शनकेबल सर्वर चल रहा है
- एक ActiveJob बैकएंड (आमतौर पर नोटिसेड द्वारा उपयोग किया जाता है)
<पी> नोट:इस प्रोजेक्ट के लिए संपूर्ण नमूना कोड GitHub पर उपलब्ध है। आप नीचे भी अनुसरण कर सकते हैं - हम आपको चरण-दर-चरण मार्गदर्शन करेंगे। पी> आपके रूबी ऑन रेल्स एप्लिकेशन के लिए एक केबलरेडी प्राइमर
<पी> आइए केबलरेडी से खुद को परिचित कराकर शुरुआत करें। 2017 में जारी, इसे "लापता एक्शनकेबल मानक लाइब्रेरी" के रूप में माना जा सकता है . <पी> टर्बो के आगमन से पहले, रूबी ऑन रेल्स में वास्तविक समय के अनुप्रयोगों को तैयार करने का एकमात्र तरीका एक्शनकेबल के माध्यम से था। एक्शनकेबल वेबसॉकेट के आसपास मूल रेल रैपर है, जो किसी भी समय दोनों दिशाओं में लगातार कनेक्शन के माध्यम से संदेश भेजने के लिए सर्वर-साइड और क्लाइंट-साइड एपीआई दोनों प्रदान करता है। <पी> इस दृष्टिकोण का नकारात्मक पक्ष यह था (और है) कि इसे पूरा करने के लिए आपको बहुत सारे बॉयलरप्लेट कोड लिखने होंगे। <पी> यह वह जगह है जहां CableReady सर्वर पर ट्रिगर होने वाले कई DOM ऑपरेशनों के चारों ओर एक अमूर्त परत प्रदान करके मदद करता है। कुछ उदाहरणों में शामिल हैं: - DOM उत्परिवर्तन (
inner_html , insert_adjacent_html , morph , आदि)
- DOM तत्व गुण उत्परिवर्तन (
add_css_class , remove_css_class , set_dataset_property , आदि)
- मनमाने ढंग से DOM ईवेंट भेजना
- ब्राउज़र इतिहास में हेरफेर
- सूचनाएं (जिसका हम उपयोग करेंगे)
केबलरेडी सर्वर और क्लाइंट
<पी> CableReady अपना जादू कैसे चलाता है? संक्षेप में, इसमें सर्वर-साइड और क्लाइंट-साइड भाग शामिल हैं। <पी> सर्वर साइड पर, मॉड्यूल CableReady::Broadcaster आपके एप्लिकेशन के किसी भी हिस्से में शामिल किया जा सकता है जिसके लिए इसकी आवश्यकता है। यह किसी जॉब, मॉडल कॉलबैक या सादे नियंत्रक में हो सकता है। लेकिन सबसे पहले, एक एक्शनकेबल चैनल स्थापित होना चाहिए। CableReady के आधिकारिक दस्तावेज़ का हवाला देते हुए: <पी> ध्यान दें कि visitors इसे स्ट्रीम पहचानकर्ता कहा जाता है . इसका उपयोग या तो व्यापक दर्शकों को लक्षित करने के लिए किया जा सकता है या केवल आपके चैनल की सदस्यता लेने वाले विशिष्ट ग्राहकों को लक्षित करने के लिए किया जा सकता है। उदाहरण को समाप्त करने के लिए, हम ब्रॉडकास्टर मॉड्यूल को एक मॉडल में शामिल कर सकते हैं और एक console.log भेज सकते हैं साइन-अप के बाद ग्राहक को: <पी> ग्राहक पक्ष पर, तर्क सरल है। उपरोक्त चैनल की सदस्यता बनाएं. फिर, इसके प्राप्त हुक में, CableReady.perform पर कॉल करें तार के ऊपर से गुज़रे सभी कार्यों पर: केबलरेडी बनाम टर्बो फॉर रेल्स
<पी> संक्षेप में, आपको CableReady का उपयोग कब करना चाहिए और कब इससे बचना चाहिए? <पी> टर्बो की शुरूआत के साथ, वेब विकास समुदाय को सर्वर-प्रदत्त प्रतिक्रियाशील अनुप्रयोगों को तैयार करने के लिए एक शक्तिशाली टूलबॉक्स प्राप्त हुआ। रेल के लिए शक्तिशाली सर्वर-साइड बाइंडिंग के साथ अनिवार्य रूप से एक फ्रंटएंड तकनीक होने के नाते, यह मानक मॉडल-व्यू-कंट्रोलर (एमवीसी) स्टैक में अच्छी तरह से फिट बैठता है। इस प्रकार, यह आपके ऐप की अधिकांश सामान्य आवश्यकताओं को पूरा कर सकता है। <पी> दूसरी ओर, CableReady, वास्तविक समय रेल विकास का स्विस सेना चाकू है और इसका उपयोग सावधानी से किया जाना चाहिए। यह एक शक्तिशाली अमूर्तता है जो व्यापक रूप से उपयोग करने के लिए बहुत आकर्षक लग सकती है। लेकिन अगर आप कल्पना करते हैं कि आपके DOM के हर हिस्से को आपके ऐप में किसी भी स्थान से बदला जा सकता है, तो आप समझेंगे कि इससे दौड़ की स्थिति और मुश्किल से ट्रैक करने वाले बग पैदा हो सकते हैं। <पी> हालाँकि, ऐसे कुछ मामले हैं, जहाँ CableReady सही अर्थ रखता है क्योंकि यह DOM पर अधिक सूक्ष्म नियंत्रण की अनुमति देता है। <पी> एक सरल टीएलडीआर के लिए पूछे जाने पर, मैं जवाब दूंगा कि टर्बो एप्लिकेशन डेवलपर्स के लिए है, जबकि केबलरेडी लाइब्रेरी बिल्डरों के लिए है। लेकिन जैसा कि हम देखेंगे, दोनों के बीच अस्पष्ट क्षेत्र हैं। देखा गया - रूबी ऑन रेल्स एप्लिकेशन के लिए सरल सूचनाएं
<पी> सिस्टम नोटिफिकेशन देने के लिए हम जिस दूसरी लाइब्रेरी का उपयोग करेंगे, वह क्रिस ओलिवर का नोटिसेड रत्न है। मूल रूप से, यह एक ActiveRecord मॉडल पर बनाया गया है जो प्राप्तकर्ता के लिए एक एकल अधिसूचना को मॉडल करता है . इसमें सामान्य मेटाडेटा होता है, जैसे: - किसे (प्राप्तकर्ता को) अधिसूचना भेजी गई थी
- जब अधिसूचना पढ़ी गई
- कोई भी पैरामीटर जिसके साथ अधिसूचना संबद्ध है (आमतौर पर किसी अन्य मॉडल का संदर्भ)
<पी> यदि आप जानते हैं कि ActiveStorage/ActionText मेटा-टेबल कैसे काम करते हैं, तो यह बहुत समान है। <पी> इसके निकट, नोटिसेड ने PORO (सादी पुरानी रूबी वस्तुएं) का उपयोग किया है , यानी, रेल या अन्य फ्रेमवर्क से बिना किसी कनेक्शन वाली वस्तुएं), जो वास्तविक सूचनाओं के लिए ब्लूप्रिंट के रूप में काम करती हैं। इन्हें, कुछ हद तक भ्रामक रूप से, अधिसूचनाएं भी कहा जाता है और इन्हें प्रस्तुत करने और वितरित करने के तरीके के बारे में तर्क दिया जाता है। यहां README से एक उदाहरण दिया गया है: <पी> हम इसे शीघ्र ही कार्यस्थल पर देखेंगे। विशेष रुचि वाले deliver_by हैं आह्वान, क्योंकि वे निर्धारित करते हैं कि इस अधिसूचना को किन वितरण विधियों का उपयोग करना चाहिए: deliver_by :database बाद में पहुंच के लिए एक अधिसूचना रिकॉर्ड (ऊपर उल्लिखित मॉडल का) संग्रहीत करता है
deliver_by :action_cable इसे एक परिभाषित एक्शनकेबल चैनल और स्ट्रीम (डिफ़ॉल्ट Noticed::NotificationChannel) के माध्यम से भेजता है )
deliver_by :email अधिसूचना भेजने के लिए उपयोग किए जाने वाले मेलर को निर्दिष्ट करता है। उदाहरण दर्शाता है कि प्राप्तकर्ता द्वारा निर्धारित किसी भी प्राथमिकता को कैसे ध्यान में रखा जाए।
<पी> इस लेख के शेष भाग के लिए हमारा लक्ष्य एक कस्टम डिलीवरी पद्धति को लागू करना है जो हमारे सिस्टम सूचनाएं भेजेगी। एक कस्टम डिलीवरी विधि:नोटिफिकेशन एपीआई के माध्यम से सिस्टम नोटिफिकेशन
<पी> इससे पहले कि हम ऐसा करने के लिए निकलें, आइए एक नया रेल एप्लिकेशन बनाकर ज़मीन साफ़ करें। चूँकि इस तरह CableReady के साथ एकीकरण करना आसान है, इसलिए मैंने esbuild को चुना importmaps पर जावास्क्रिप्ट विकल्प : <पी> ध्यान दें: लेखन के समय, वर्तमान रेल संस्करण 7.0.4 है। यदि आपके पास मौजूदा रेल एप्लिकेशन है, तो आप अगले चरण को छोड़ सकते हैं, लेकिन सुनिश्चित करें कि आपके पास अधिसूचना प्राप्तकर्ता के रूप में कार्य करने के लिए एक उपयोगकर्ता मॉडल या समान अवधारणा है। . 1. प्राप्तकर्ता तैयार करें
<पी> नोटिस को प्राप्तकर्ताओं के रूप में कार्य करने के लिए एक उपयोगकर्ता मॉडल की आवश्यकता है, इसलिए संक्षिप्त होने के लिए, डिवाइस बनाएं और एक उपयोगकर्ता मॉडल तैयार करें। <पी> इसके बाद, रेल्स कंसोल खोलें और एक नमूना उपयोगकर्ता बनाएं: 2. नोटिस जोड़ें
<पी> इसके बाद, आइए अपने बंडल में नोटिसेड जोड़ें और डेटाबेस मॉडल तैयार करें। <पी> हम जैसा बताया गया है वैसा ही करते हैं, db:migrate चलाते हैं और बहुरूपी has_many जोड़ें हमारे उपयोगकर्ता मॉडल से जुड़ाव: <पी> इसका परीक्षण करने से पहले अंतिम चरण एक ब्लूप्रिंट PORO बनाना है: <पी> हमने इसे थोड़ा बदल दिया है ताकि यह फिलहाल डेटाबेस डिलीवरी पद्धति और प्लेसहोल्डर संदेश का उपयोग कर सके। आप आम तौर पर संदेश बनाने और लिंक करने के लिए यूआरएल बनाने के लिए मॉडल आईडी की तरह यहां आवश्यक पैरामीटर जोड़ेंगे - विवरण के लिए नोटिसेड रीडमी देखें।पी> <पी> केवल रेल कंसोल का उपयोग करके, हम यह प्रदर्शित कर सकते हैं कि अब इस PORO के आधार पर अधिसूचना कैसे वितरित की जाए: <पी> जैसा कि हम देख सकते हैं, नोटिस्ड एक डेटाबेस इंसर्ट करता है, इसलिए अब हम सभी Notifications प्राप्त कर सकते हैं किसी निर्दिष्ट उपयोगकर्ता के लिए: <पी> यह हमारे लिए एक सरल सूचकांक दृश्य बनाने के लिए पर्याप्त है जो वर्तमान उपयोगकर्ता के लिए वितरित सभी सूचनाओं को सूचीबद्ध करता है: <पी> bin/dev के साथ ऐप को स्पिन करने के बाद , हम लॉग इन कर सकते हैं और http://localhost:3000/notifications पर ब्राउज़ कर सकते हैं: <पी>
3. केबलरेडी स्थापित कर रहा है
<पी> CableReady का उपयोग करने के लिए, हमें इसे इंस्टॉल करना होगा। सौभाग्य से, यह जल्दी हो गया: <पी> आइए एक NotificationChannel जनरेट करें हमारे संदेश पहुंचाने के लिए: <पी> यह सभी गायब एक्शनकेबल (जावास्क्रिप्ट) निर्भरता को जोड़ देगा और संबंधित चैनल फ़ाइलों को तैयार कर देगा, विशेष रूप से app/channels/notification_channel.rb और app/javascript/channels/notification_channel.js . <पी> सर्वर-साइड चैनल के लिए, हम Noticed::NotificationChannel से प्राप्त करते हैं : <पी> आगे बढ़ने से पहले, हमें यह सुनिश्चित करना होगा कि हमारा एक्शनकेबल डेविस उपयोगकर्ताओं के लिए प्रमाणित है। मैं यहां उसके बारे में विस्तार से नहीं बताऊंगा। आवश्यक बॉयलरप्लेट इस तरह दिखती है: <पी> अन्य विकल्पों के लिए StimulusReflex दस्तावेज़ देखें। <पी> क्लाइंट पक्ष पर, हमें ऊपर उल्लिखित सेटअप कोड का छोटा सा हिस्सा जोड़ना होगा: <पी> ध्यान दें: एक्शनकेबल के काम करने के लिए रेडिस की आवश्यकता है, इसलिए इस लेख का शेष भाग मानता है कि आपके पास एक स्थानीय सर्वर चल रहा है। 4. वितरण विधि कार्यान्वयन
<पी> सिस्टम सूचनाओं को प्रसारित करने के लिए, आइए एक नई डिलीवरी विधि उत्पन्न करें: <पी> मचान वर्ग इस तरह दिखता है: <पी> आइए हम अपने deliver की कल्पना कैसे करते हैं, इसका मसौदा तैयार करना जारी रखें काम करने का तरीका. <पी> हमने channel उधार लिया है विधि आंशिक रूप से अंतर्निहित एक्शनकेबल डिलीवरी विधि से। यह हमें क्लास विधि विकल्प के माध्यम से एक चैनल में प्रवेश करने की अनुमति देता है। अन्यथा, यह वापस प्रदत्त Noticed::NotificationsChannel पर आ जाता है . <पी> फिर हम CableReady के notification का उपयोग करते हैं प्राप्तकर्ता को संबंधित उदाहरण प्रसारित करने की विधि। <पी> इसे क्रियान्वित करने के लिए, हमें इसे अपने अधिसूचना PORO: से जोड़ना होगा 5. इसे काम पर लगाना
<पी> अब बस इसे आज़माना बाकी है। हम इसे आसानी से रेल्स कंसोल से फिर से चला सकते हैं: <पी> यह मानते हुए कि आप अभी भी लॉग इन हैं, ब्राउज़र सबसे पहले आपसे ऐप की ओर से सूचनाएं प्राप्त करने की अनुमति मांगेगा: <पी>
<पी> एक बार जब आप इसकी पुष्टि कर लेते हैं, तो आपको अपने ब्राउज़र से यह सुंदर पॉप-अप अधिसूचना प्राप्त होती है: <पी>
समापन
<पी> केबलरेडी और नोटिसेड के माध्यम से फास्ट लेन टूर करते हुए, हमने प्रदर्शित किया है कि एक देशी ब्राउज़र एपीआई को अपने ऐप में कैसे एकीकृत किया जाए। परिणाम आपके उपयोगकर्ताओं तक सिस्टम सूचनाएं पहुंचाने का एक सरल, सुसंगत तरीका है। <पी> यह उपयोग मामला यह दर्शाने के लिए भी है कि CableReady को आपके उपयोग के मामले में मिलाना कितना आसान है। यदि आप एक कदम आगे सोचते हैं, तो तैयार की गई डिलीवरी विधि को लाइब्रेरी में अलग करना कठिन नहीं है। <पी> मुझे आशा है कि यह आपको अपने ऐप में लंबवत प्रतिक्रियाशील समस्या डोमेन की अभिव्यक्तियों को देखने और CableReady को आज़माने के लिए प्रेरित करेगा। <पी> मेरी नई पुस्तक एडवांस्ड केबलरेडी उठाकर और पढ़ें। <पी> कूपन कोड APPSIGNAL-PROMO का उपयोग करें और $10 बचाएं! <पी> हैप्पी कोडिंग! <पी> पी.एस. यदि आप प्रेस से हटते ही रूबी मैजिक पोस्ट पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूज़लेटर की सदस्यता लें और एक भी पोस्ट न चूकें! पी>