2010-05-12 19 views
5

मैं अपने मॉडल में है:। ऐसा करने का एक बेहतर तरीका है?

def presenter 
    @presenter ||= ProfilePresenter.new(self) 
    @presenter 
end 

ProfilePresenter एक वर्ग है) की तरह, get_link विधियों (, get_img_url (आकार), get_sex(), get_relationship_status() और अन्य तरीकों के साथ क्या करना है कि नहीं है मॉडल, नियंत्रक के साथ भी नहीं बल्कि दृश्य में कई बार उपयोग किया जाता है।

तो अब मैं उन्हें ऐसा करने से उपयोग करें:

Profile.presenter.get_link 
# or 
Profile.presenter.get_img_url('thumb') # returns the path of the image. is not used to make a db query 

Sincerelly मुझे लगता है कि मैं प्रस्तुतकर्ताओं की वास्तविक अवधारणा से चूक गए .. लेकिन यह क्या है कि यह कैसे कहा जा सकता है, संग्रह करने के लिए कोशिश कर रहा हूँ है?

उत्तर

16

आम तौर पर बात की इस तरह जैसे सहायक तरीकों, के माध्यम से नियंत्रित किया जाता है:

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 %> 
+0

यह एक बहुत अच्छा तरीका है। स्वच्छ। क्या आप इस तरह कुछ इस्तेमाल कर रहे हैं? – nathanvda

+0

बस उपयोग करना आसान नहीं है: "@ profile.presenter.get_url" और यह जाने के लिए तैयार है? या यह अधिक संकुचित हो सकता है: "@ profile.pr.get_url"। ऐसा इसलिए है क्योंकि मैं सिर्फ लूप में इतना उपयोग नहीं करता हूं लेकिन अन्य चीजें इसलिए उपयोग करेंगी: "presenter_for (@profile) .get_url" –

+0

@nathanvda मैंने पहले इस तरह के रैपर के साथ दृष्टिकोण का उपयोग किया है, हालांकि उन्होंने भी इसका पालन नहीं किया प्रेजेंटर पैटर्न बारीकी से। यह मॉडल और दृश्य दुनिया को ब्रिज करने की तकनीक है। – tadman

संबंधित मुद्दे