2010-05-12 5 views
5

ich in meinem Modell haben:Über Presenter-Muster in Schienen. ist ein besserer Weg, es zu tun?

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

Die ProfilePresenter ist eine Klasse, die Methoden wie, get_link(), get_img_url (Größe), get_sex(), get_relationship_status() und andere Methoden, die nicht mit dem zu tun haben das Modell, nicht einmal mit dem Controller, sondern wird mehrfach in der Ansicht verwendet.

So dass ich jetzt nutzen sie, um dies zu tun:

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 Ich glaube, ich verpasste das reale Konzept der Moderatoren aus .. aber das ist, was zu archivieren versuche, wie diese genannt werden kann?

Antwort

16

Normalerweise wird diese Art der Sache über Hilfsmethoden behandelt, wie:

def profile_link(profile) 
    profile.link ? content_tag(:a, h(profile.name), :href => profile.link) : 'No profile' 
end 

Es ist bedauerlich, Sie nicht in Presenter-Stil Hilfsmethoden Schicht, die ein Modell im Blick Zeit verlängern. Sie müssen in einer prozeduralen Weise mit einem Parameter aufgerufen werden, einer Art Anti-OO. Der Presenter-Ansatz wird im MVC-Bereich von Rails nicht vollständig unterstützt, da er an eine Ansicht gebunden werden muss, um auf die verschiedenen Hilfsmethoden zugreifen zu können, die zum ordnungsgemäßen Rendern von Inhalt erforderlich sind, sowie Informationen über die Sitzung, die sich auf die Präsentation auswirken können .

Ein robuster Ansatz könnte so etwas zu tun sein:

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 

Das ist wie in der Ansicht als etwas zeigen würde:

<% ProfilePresenter.new(self, @profile) do |profile| %> 
<div><%= profile.link %> 
<% end %> 

Sie vereinfachen kann diesen Aufruf von einem Helfer machen Methode, die etwas mild verrückt macht:

Dies bedeutet, Sie haben eine viel einfachere Anruf:

<% presenter_for(@profile) do |profile| %> 
<div><%= profile.link %> 
<% end %> 
+0

Dies ist ein sehr netter Ansatz. Reinigen. Benutzt du so etwas jetzt? – nathanvda

+0

Ist nicht einfacher zu verwenden: "@ profile.presenter.get_url" und es ist bereit zu gehen? oder es könnte komprimierter sein wie: "@ profile.pr.get_url". Das, weil ich nicht so viel nur in Schleifen verwende, aber andere Dinge, so würde die Verwendung sein: "presenter_for (@profile) .get_url" –

+0

@nathanvda Ich habe Ansätze wie diese mit Wrappers zuvor verwendet, obwohl auch sie nicht folgen Moderatormuster so nah. Dies ist eine Technik zur Überbrückung der Welten Model und View. – tadman