आम तौर पर बात की इस तरह जैसे सहायक तरीकों, के माध्यम से नियंत्रित किया जाता है:
def profile_link(profile)
profile.link ? content_tag(:a, h(profile.name), :href => profile.link) : 'No profile'
end
यह दुर्भाग्यपूर्ण आप प्रस्तुतकर्ता शैली सहायक तरीकों कि दृश्य समय में एक मॉडल का विस्तार में परत नहीं कर सकता है। उन्हें पैरामीटर, एंटी-ओओ के प्रकार के साथ प्रक्रियात्मक तरीके से बुलाया जाना चाहिए।
प्रेजेंटर दृष्टिकोण रेल एमवीसी क्षेत्र में पूरी तरह से समर्थित नहीं है क्योंकि इसे सामग्री को उचित रूप से प्रस्तुत करने के लिए आवश्यक विभिन्न सहायक विधियों तक पहुंचने के लिए एक दृश्य से जुड़ना होगा, साथ ही सत्र के बारे में जानकारी जो प्रेजेंटेशन को प्रभावित कर सकती है ।
<% ProfilePresenter.new(self, @profile) do |profile| %>
<div><%= profile.link %>
<% end %>
आप एक सहायक बनाकर इस बुला आसान बनाने में कर सकते हैं:
class ProfilePresenter
def initialize(view, profile)
@profile = profile
@view = view
yield(self) if (block_given?)
end
def link
@profile.link ? @view.content_tag(:a, @view.h(profile.name), :href => @profile.link) : 'No profile'
end
def method_missing(*args)
@profile.send(*args)
end
end
कुछ इस तरह के रूप में अपने ध्यान में रखते हुए नज़र आएगा:
एक और अधिक मजबूत दृष्टिकोण इस तरह कुछ करने के लिए हो सकता है विधि है कि कुछ की तरह हल्का पागल करता है:
def presenter_for(model)
"#{model.class}Presenter".constantize.new(self, model) do |presenter|
yield(presenter) if (block_given?)
end
end
इसका मतलब यह है कि आप एक बहुत सरल है कॉल करें:
<% presenter_for(@profile) do |profile| %>
<div><%= profile.link %>
<% end %>
यह एक बहुत अच्छा तरीका है। स्वच्छ। क्या आप इस तरह कुछ इस्तेमाल कर रहे हैं? – nathanvda
बस उपयोग करना आसान नहीं है: "@ profile.presenter.get_url" और यह जाने के लिए तैयार है? या यह अधिक संकुचित हो सकता है: "@ profile.pr.get_url"। ऐसा इसलिए है क्योंकि मैं सिर्फ लूप में इतना उपयोग नहीं करता हूं लेकिन अन्य चीजें इसलिए उपयोग करेंगी: "presenter_for (@profile) .get_url" –
@nathanvda मैंने पहले इस तरह के रैपर के साथ दृष्टिकोण का उपयोग किया है, हालांकि उन्होंने भी इसका पालन नहीं किया प्रेजेंटर पैटर्न बारीकी से। यह मॉडल और दृश्य दुनिया को ब्रिज करने की तकनीक है। – tadman