Ruby on Rails
डेकोरेटर पैटर्न
खोज…
टिप्पणियों
डेकोरेटर पैटर्न आपको आधार वस्तु को प्रभावित किए बिना स्थिति के व्यवहार को जोड़ने या संशोधित करने की अनुमति देता है।
यह प्राप्त किया जा सकता है हालांकि सादे रूबी stdlib का उपयोग कर, या ड्रेपर जैसे लोकप्रिय रत्नों के माध्यम से।
SimpleDelegator का उपयोग करके एक मॉडल को सजाने
अधिकांश रेल डेवलपर अपने मॉडल की जानकारी को टेम्पलेट के भीतर ही संशोधित करके शुरू करते हैं:
<h1><%= "#{ @user.first_name } #{ @user.last_name }" %></h1>
<h3>joined: <%= @user.created_at.in_time_zone(current_user.timezone).strftime("%A, %d %b %Y %l:%M %p") %></h3>
बहुत सारे डेटा वाले मॉडल के लिए, यह जल्दी से बोझिल हो सकता है और एक टेम्पलेट से दूसरे में कॉपी-पेस्ट करने वाले तर्क को जन्म दे सकता है।
यह उदाहरण SimpleDelegator
से SimpleDelegator
का उपयोग करता है।
एक SimpleDelegator
ऑब्जेक्ट के सभी अनुरोध डिफ़ॉल्ट रूप से पैरेंट ऑब्जेक्ट को पास किए जाते हैं। आप प्रस्तुति तर्क के साथ किसी भी विधि को ओवरराइड कर सकते हैं, या आप इस दृष्टिकोण के लिए नए तरीके जोड़ सकते हैं।
SimpleDelegator
दो तरीके प्रदान करता है: __setobj__
उस ऑब्जेक्ट को प्राप्त करने के लिए किस ऑब्जेक्ट को प्रत्यायोजित किया जा रहा है, और __getobj__
।
class UserDecorator < SimpleDelegator
attr_reader :view
def initialize(user, view)
__setobj__ @user
@view = view
end
# new methods can call methods on the parent implicitly
def full_name
"#{ first_name } #{ last_name }"
end
# however, if you're overriding an existing method you need
# to use __getobj__
def created_at
Time.use_zone(view.current_user.timezone) do
__getobj__.created_at.strftime("%A, %d %b %Y %l:%M %p")
end
end
end
कुछ सज्जाकार इस व्यवहार को तार-तार करने के लिए जादू पर भरोसा करते हैं, लेकिन आप इसे और अधिक स्पष्ट कर सकते हैं कि प्रस्तुति तर्क पृष्ठ पर ऑब्जेक्ट को इनिशियलाइज़ करके आ रही है।
<% user = UserDecorator.new(@user, self) %>
<h1><%= user.full_name %></h1>
<h3>joined: <%= user.created_at %></h3>
डेकोरेटर में व्यू ऑब्जेक्ट के संदर्भ को पास करके, हम अभी भी सभी व्यू हेल्पर्स को एक्सेस कर सकते हैं, जबकि इसे शामिल किए बिना प्रेजेंटेशन लॉजिक का निर्माण कर सकते हैं।
अब दृश्य टेम्पलेट केवल पेज में डेटा डालने से संबंधित है, और यह बहुत अधिक स्पष्ट है।
ड्रेपर का उपयोग करके एक मॉडल को सजाने
ड्रेपर सम्मेलन द्वारा स्वचालित रूप से अपने सज्जाकारों के साथ मॉडल से मेल खाता है।
# app/decorators/user_decorator.rb
class UserDecorator < Draper::Decorator
def full_name
"#{object.first_name} #{object.last_name}"
end
def created_at
Time.use_zone(h.current_user.timezone) do
object.created_at.strftime("%A, %d %b %Y %l:%M %p")
end
end
end
ActiveRecord ऑब्जेक्ट वाले @user
वैरिएबल को देखते हुए, आप @user
पर #decorate
को कॉल करके, या यदि आप विशिष्ट होना चाहते हैं, तो ड्रेपर क्लास को निर्दिष्ट करके अपने डेकोरेटर तक पहुँच सकते हैं।
<% user = @user.decorate %><!-- OR -->
<% user = UserDecorator.decorate(@user) %>
<h1><%= user.full_name %></h1>
<h3>joined: <%= user.created_at %></h3>