Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

Presenter और Service Objects के साथ Rails आर्किटेक्चर को बढ़ाएं: सिद्ध डिज़ाइन पैटर्न

हमें डिज़ाइन पैटर्न की आवश्यकता क्यों है?

समस्या यह है कि Rails आर्किटेक्चर, मॉडल-व्यू-कंट्रोलर, आपको अपने कोड को रखने के लिए एक बुनियादी संरचना देता है।

लेकिन यह पर्याप्त नहीं है।

आपके व्यूज़ बड़े और लॉजिक से भरे हो जाते हैं जब उनका लक्ष्य जानकारी प्रस्तुत करना होता है।

आपके कंट्रोलर्स उन विवरणों को रखते हैं जो कंट्रोलर के लिए उसके आवश्यक कार्य करने के लिए आवश्यक से परे हैं।

समाधान क्या है?

हमने इन समस्याओं को हल करने के लिए डिज़ाइन पैटर्न के रूप में दो समाधान बनाए हैं।

  • द प्रेजेंटर पैटर्न
  • द सर्विस ऑब्जेक्ट पैटर्न

हर कोई इस बात पर सहमत नहीं है कि उन्हें कैसे ठीक से लागू किया जाए, लेकिन मैं आपको वह संस्करण दूंगा जो मेरे लिए काम करता है।

आइए इन पैटर्न का पता लगाएं!

Rails में Presenters का उपयोग कैसे करें

व्यूज़ प्रस्तुति के लिए हैं, इसका मतलब है HTML, CSS, और ERB (एंबेडेड Ruby)।

व्यूज़ में कोई ActiveRecord क्वेरी नहीं होनी चाहिए।

और अधिकांश लॉजिक को छोड़ दिया जाना चाहिए यदि आप अपने व्यूज़ को यथासंभव साफ और काम करने में आसान रखना चाहते हैं।

"लॉजिक" से मेरा मतलब है if स्टेटमेंट्स और टर्नरी ऑपरेटर्स के साथ निर्णय लेना

अब सवाल है...

कैसे?

व्यूज़ में लॉजिक को संभालने के लिए आपका पहला टूल हेल्पर्स का उपयोग करना है।

हेल्पर्स बहुत अच्छे हैं जब भी आपके पास एक ग्लोबल फॉर्मेटिंग मेथड होता है जिसका उपयोग आप कई व्यूज़ में करते हैं।

उदाहरण के लिए:

Markdown रेंडर करना, एक विशिष्ट फॉर्मेट में तारीखें दिखाना, टेक्स्ट से विशिष्ट शब्दों को हटाना, आदि।

इस तरह:

 module DateHelper
  def date_as_month_and_year(date)
    date.strftime("%B %Y")
  end
end 

आप इस कोड को app/helpers फोल्डर के तहत और date_helper.rb फाइल में सेव कर सकते हैं।

यहाँ एक टिप है:

हमेशा हेल्पर मेथड्स में आर्गुमेंट्स के माध्यम से इनपुट पास करें, कभी भी इंस्टेंस वेरिएबल्स पर भरोसा न करें।

यह आपको बहुत सारी परेशानी से बचाएगा।

हेल्पर मेथड्स की सीमाएं हैं, विशेष रूप से यदि आप उन्हें अपने व्यूज़ में हर फॉर्मेटिंग आवश्यकता के लिए उपयोग करते हैं।

वे जमा होते हैं और किसी भी प्रकार के संगठन की कमी होती है।

समाधान आ रहा है!

कॉम्प्लेक्स कंडीशनल्स और फॉर्मेटिंग मेथड्स को प्रेजेंटर ऑब्जेक्ट से बदलें

मान लीजिए आपके पास ऐसा व्यू है:

 <p>
  Post title: <%= post.title.gsub("forbidden word", "") %>
  <%= link_to "Read post", post, class: "w-75 p-3 text-#{post.draft? ? "orange" : "green"} border-#{post.draft? ? "orange" : "green"}" %>
</p> 

काफी छोटा व्यू, है ना?

लेकिन ये टर्नरी ऑपरेटर्स और डुप्लिकेट कोड के साथ बहुत जटिल लगता है।

अच्छा नहीं!

आइए इसे हल करने के लिए एक प्रेजेंटर क्लास बनाते हैं।

यहाँ कैसे:

 class PostPresenter
  def initialize(post)
    @post = post
  end

  def title_without_forbidden_words
    @post.title.gsub("forbidden word", "")
  end

  def css_color
    @post.draft? ? "orange" : "green"
  end
end 

इसे app/presenters/post_presenter.rb के तहत सेव करें, यदि आपके पास नहीं है तो presenters फोल्डर बनाएं।

अब आप व्यू को बदल सकते हैं।

इस तरह:

 <% presenter = PostPresenter.new(post) %>
<p>
  Post title: <%= presenter.title_without_forbidden_words %>
  <%= link_to "Read post", post, class: "w-75 p-3 text-#{presenter.css_color} border-#{presenter.css_color}" %>
</p> 

वहाँ आप जाएं!

  • हमने व्यू से सभी लॉजिक को हटा दिया
  • हमने फॉर्मेटिंग और निर्णय लेने के संचालन के लिए सार्थक नाम जोड़े
  • हम कोड डुप्लिकेट किए बिना अन्य व्यूज़ में इस क्लास का पुनः उपयोग कर सकते हैं

यही है कि आप Rails में प्रेजेंटर का उपयोग कैसे करते हैं 🙂

Service Objects का उपयोग कैसे करें

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

ये ऑपरेशन डेलिगेट किए जाने चाहिए एक सर्विस ऑब्जेक्ट को।

एक सर्विस ऑब्जेक्ट, जैसा कि मैं इसे परिभाषित करता हूं, एक Ruby मॉड्यूल है जो एक एक्शन को पूरा करने के लिए लॉजिक को एनकैप्सुलेट करता है।

उदाहरण:

 module TwitterService
  def self.send_welcome_message(twitter_handle)
    client.update("@#{twitter_handle} welcome to 'Oranges & Apples', we hope you enjoy our juicy fruit!")
  end

  def self.client
    @client ||= Twitter::REST::Client.new do |config|
      config.consumer_key = "..."
      config.consumer_secret = "..."
      config.access_token = "..."
      config.access_token_secret = "..."
    end
  end
end 

कन्वेंशन है कि इसे app/services फोल्डर के तहत सेव करें, और twitter_service.rb जैसी फाइल।

आप इसका उपयोग कैसे करते हैं?

क्योंकि Rails app/ से सब कुछ ऑटोलोड करता है, यह कोड आपके कंट्रोलर्स में उपलब्ध होगा।

उदाहरण:

 class UsersController
  def create
    # ...
    TwitterService.send_welcome_message(user.twitter_handle)
  end
end 

यही है सर्विस ऑब्जेक्ट पैटर्न एक्शन में।

सारांश

आपने दो उपयोगी Rails पैटर्न सीखे हैं जो बुद्धिमानी से उपयोग किए जाने पर आपके प्रोजेक्ट की कोड क्वालिटी को बेहतर बनाने में मदद करेंगे!

अब उन्हें लागू करने की आपकी बारी है 🙂

पढ़ने के लिए धन्यवाद।


  1. Hotwire के साथ Rails ऐप्स को तेज़ करें: JavaScript के बिना सर्वर-साइड रेंडरिंग Hotwire के साथ Rails ऐप्स को तेज़ करें: JavaScript के बिना सर्वर-साइड रेंडरिंग

    यदि आप पेज परिवर्तनों और फॉर्म सबमिशन को तेज़ करने और जटिल पेज को बिना कोई JavaScript कोड लिखे घटकों में विभाजित करने का तरीका ढूंढ रहे हैं, तो यह पोस्ट आपको Hotwire के साथ Rails को अगले स्तर पर ले जाने में मदद करेगी। यह लेख आपको सर्वर-साइड रेंडरिंग के लिए एक टूल का उपयोग करना सिखाएगा। Hotwire क्या

  1. AWS Lambda पर रूबी ऑन Rails डिप्लॉय करना: चरण-दर-चरण मार्गदर्शिका AWS Lambda पर रूबी ऑन Rails डिप्लॉय करना: चरण-दर-चरण मार्गदर्शिका

    सर्वरलेस कंप्यूटिंग सर्वर को प्रबंधित और प्रोविजन करने के काम को क्लाउड प्रोवाइडर पर उतारने में मदद करता है और अधिकांश प्रौद्योगिकी टीमों के लिए तेजी से एक चीज बन रहा है। AWS Lambda एक प्रकार की सर्वरलेस तकनीक है जिसका उपयोग कई प्रौद्योगिकी टीमों द्वारा किया जाता है। AWS Lambda अधिकांश मुख्य प्रोग्र

  1. Angular को Rails 5 के साथ इंटीग्रेट करना: एक सहज फुल-स्टैक दृष्टिकोण Angular को Rails 5 के साथ इंटीग्रेट करना: एक सहज फुल-स्टैक दृष्टिकोण

    आपने पहले कहानी सुनी है। आपके पास पहले से ही एक एप्लिकेशन है जो आपके विकेंद्रीकृत और पूरी तरह से काम करने वाले बैक-एंड APIs और किसी सामान्य टूलसेट के साथ बने फ्रंट-एंड पर चल रहा है। अब, आप Angular पर आगे बढ़ना चाहते हैं। या, शायद आप बस अपने रेल्स प्रोजेक्ट्स के साथ Angular को इंटीग्रेट करने का एक तर