खोज…


टिप्पणियों

डेकोरेटर पैटर्न आपको आधार वस्तु को प्रभावित किए बिना स्थिति के व्यवहार को जोड़ने या संशोधित करने की अनुमति देता है।

यह प्राप्त किया जा सकता है हालांकि सादे रूबी 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>


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow