Rails पार्शियल वर्षों से मौजूद हैं, लेकिन वे अनाड़ी हो सकते हैं क्योंकि वे केवल ERB स्निपेट्स हैं जिनके पास बैकिंग ऑब्जेक्ट संरचना नहीं है।
हाल ही में, ViewComponent और Phlex जैसी लाइब्रेरीज ने टेम्पलेट्स में अधिक सिमेंटिक संरचना जोड़कर व्यू लेयर को बेहतर बनाने की कोशिश की है। ये बेहतरीन लाइब्रेरीज हैं और मैं व्यक्तिगत रूप से लगभग हर प्रोजेक्ट पर ViewComponent का उपयोग करता हूं जिस पर मैं काम करता हूं। उस ने कहा, मुझे अभी भी लगता है कि विनम्र Rails पार्शियल अभी भी कई उपयोग के मामलों के लिए बहुत अच्छा काम करता है।
Rails टीम हमेशा अपने प्रस्ताव को बेहतर बनाने की कोशिश कर रही है, तो आइए Rails 7.1 में पेश की गई एक नई सुविधा को देखें: सख्त स्थानीय चर!
Rails पार्शियल और स्थानीय चर
हम Rails पार्शियल में मनमाने स्थानीय चर पास कर सकते हैं और वे उपयोग के लिए जादुई रूप से उपलब्ध हो जाते हैं।
यह आदर्श नहीं है, क्योंकि यदि मार्कअप का एक बड़ा ब्लॉक है तो यह पता लगाना मुश्किल है कि एक पार्शियल कौन से चर स्वीकार करता है। इसके अलावा, चूंकि चर डायनामिक रूप से बनाए जाते हैं, एक लापता चर nil वापस नहीं करेगा बल्कि एक त्रुटि का कारण बनेगा।
मान लें कि उपरोक्त पार्शियल में icon वैकल्पिक था:
हम इसे इस तरह रेंडर करते हैं:
यह एक ActionView::Template::Error उठाएगा, संदेश undefined local variable or method 'icon' for #<ActionView::Base:0x00000000023078> के साथ।
यह तथ्य कि icon वैकल्पिक है, एक पाठक के लिए स्पष्ट नहीं है। Rails 7.1 तक, समाधान local_assigns हैश का निरीक्षण करना था जिसमें इंजेक्ट किए गए सभी स्थानीय चर होते हैं।
यह उपरोक्त त्रुटि को ठीक करता है क्योंकि icon चर अब हमेशा सेट होता है।
Rails 7.1 सख्त स्थानीय चर की अवधारणा के साथ पार्शियल में स्थानीय चरों की कमियों को संबोधित करने का प्रयास करता है।
Rails में सख्त स्थानीय चर क्या हैं?
Rails 7.1 से शुरू होकर, हम पार्शियल के शीर्ष पर एक मैजिक कमेंट लिख सकते हैं, जो यह परिभाषित करता है कि यह किन स्थानीय चरों को स्वीकार करता है और उनके लिए कोई डिफ़ॉल्ट मान।
Rails इस कमेंट को पार्स करता है और पार्शियल में परिभाषित चर सेट करता है। अब यह एक पाठक के लिए स्पष्ट है कि पार्शियल कौन से चर स्वीकार करता है और कोई डिफ़ॉल्ट मान।
पार्शियल को अभी भी ऊपर दिखाए अनुसार रेंडर करना चाहिए। कॉल साइट से title चर को बाहर करने का प्रयास करें और देखें कि क्या होता है:
आपको एक ArgumentError मिलता है जिसका संदेश missing local: :title है: पहले की तुलना में अधिक वर्णनात्मक त्रुटि संदेश!
सख्त स्थानीय चर कब उपयोग करें
सख्त स्थानीय चर उलझाऊ हो सकते हैं, इसलिए उनका उपयोग करना हमेशा एक अच्छा विचार नहीं है, विशेष रूप से लीगेसी ऐप्स में।
आइए एक उपयोग के मामले को लें जो सख्त स्थानीय चर के लिए एकदम सही है। मान लें कि हमारे पास एक पार्शियल है जो एक उपयोगकर्ता के विवरण को एक कार्ड में दिखाता है, लेकिन केवल एडमिन देख सकते हैं कि उन्होंने अंतिम बार कब साइन इन किया था:
यह पार्शियल कई चर लेता है और इसमें एक वैकल्पिक चर होता है, जो इसे सख्त स्थानीय चर के लिए एक आदर्श मामला बनाता है। फाइल में निम्नलिखित मैजिक कमेंट जोड़ने से इसे स्किम करना काफी आसान हो जाता है:
मॉडल के संबद्ध पार्शियल (जैसे posts/_post.html.erb) के मामले में, यह काफी स्पष्ट है कि ऐसा पार्शियल एक post चर स्वीकार करता है। मुझे नहीं लगता कि सख्त स्थानीय चर इन मामलों के लिए आवश्यक रूप से एक अच्छा विचार हैं।
सख्त स्थानीय चर गॉटचा
कुछ गॉटचा हैं जिनसे सावधान रहना चाहिए, यही कारण है कि मैं हर जगह सख्त स्थानीय चर का उपयोग करने की सिफारिश नहीं करता।
एक संग्रह को निहित रूप से रेंडर करना
जब निहित रूप से एक संग्रह रेंडर करते हैं:
Rails post चर के अलावा _post पार्शियल में दो चर इंजेक्ट करता है। Rails 7.1.2 से पहले, त्रुटि को रोकने के लिए इन्हें मैन्युअल रूप से परिभाषित करने की आवश्यकता थी:
यह समस्या Rails 7.1.2 में ठीक की गई थी और ये चर अब वैकल्पिक हैं (लेकिन यह जानना अच्छा है कि वे मौजूद हैं यदि आवश्यक हो)!
ActionCable पर प्रसारण
जब ActiveRecord कॉलबैक से ActionCable पर एक पार्शियल प्रसारित करते हैं:
आपको एक request_id स्थानीय चर डिफ़ॉल्ट को nil पर सेट करना होगा, क्योंकि यह Rails द्वारा हुड के तहत उपयोग किया जाता है।
ऐसा न करने पर कॉलबैक ट्रिगर होने पर त्रुटि होती है।
और हमारा व्हिसल-स्टॉप टूर पूरा हुआ!
ध्यान रखने योग्य कुछ बातें
किसी दी गई फाइल के लिए मौजूदा पार्शियल में सख्त स्थानीय चर जोड़ना एक ऑल-ऑर-नथिंग प्रस्ताव है। हम उन्हें ढूंढते ही मैजिक कमेंट में चर को उत्तरोत्तर नहीं जोड़ सकते। जैसा कि उपरोक्त गॉटचा में दिखाया गया है, मैजिक कमेंट में घोषित किए जाने वाले सभी चरों का पता लगाना मुश्किल हो सकता है।
सख्त स्थानीय चर के साथ कोड के बारे में तर्क करना कितना आसान है, इसे देखते हुए, मुझे लगता है कि वे नए ऐप्स में बड़े पैमाने पर उपयोग करने लायक हैं (और लीगेसी ऐप्स में उत्तरोत्तर पूर्वव्यापी रूप से जोड़ने के लिए)।
यह सुनिश्चित करना महत्वपूर्ण है कि लीगेसी ऐप्स में आपका टेस्ट सूट उन पार्शियल को कवर करता है जिनमें आप सख्त स्थानीय चर जोड़ते हैं। एक चूक एक अपवाद का कारण बनेगी, इसलिए आपको परिवर्तनों को तैनात करने से पहले सभी उपयोग के मामलों का परीक्षण किया गया है यह सुनिश्चित करने की आवश्यकता है।
जबकि मैं मैजिक कमेंट दृष्टिकोण का बहुत बड़ा प्रशंसक नहीं हूं (क्योंकि मेरा मानना है कि टिप्पणियों में कभी भी कार्यक्षमता नहीं होनी चाहिए), मुझे लगता है कि सख्त स्थानीय चर Rails के लिए एक बढ़िया अतिरिक्त हैं। पार्शियल को स्थानीय चर निर्दिष्ट करना हमेशा उलझाऊ रहा है और ये इसे आसान बनाते हैं। बस गॉटचा से सावधान रहें!
समापन
इस पोस्ट में, हमने Rails 7.1 में सख्त स्थानीय चर पर एक त्वरित नज़र डाली। हमने देखा कि पार्शियल और स्थानीय चर कैसे काम करते हैं, सख्त स्थानीय चर कब उपयोग करने हैं, और कुछ गॉटचा का पता लगाया।
हैप्पी कोडिंग!
P.S. यदि आप Ruby Magic पोस्ट पढ़ना चाहते हैं जैसे ही वे प्रेस से निकलते हैं, तो हमारे Ruby Magic न्यूज़लेटर की सदस्यता लें और कभी भी एक भी पोस्ट मिस न करें!
Ayush Newatia
अतिथि लेखक Ayush एक फ्रीलांस Ruby और Rails डेवलपर हैं। वे The Rails and Hotwire Codex के लेखक हैं और Bridgetown कोर टीम का हिस्सा हैं। वे एक गोपनीयता-केंद्रित मेलिंग लिस्ट ऐप Scattergun भी चलाते हैं।
Ayush Newatia के सभी आलेख