Normalmente questo genere di cose viene gestita tramite metodi helper, come ad esempio:
def profile_link(profile)
profile.link ? content_tag(:a, h(profile.name), :href => profile.link) : 'No profile'
end
E 'un peccato non si può sovrapporre a metodi di supporto in stile presentatore che si estendono un modello in fase di visualizzazione. Devono essere chiamati in modo procedurale con un parametro, tipo di anti-OO.
L'approccio di Presenter non è completamente supportato nell'area Rails MVC perché è necessario associare una vista per poter accedere ai vari metodi di supporto necessari per il rendering corretto del contenuto, oltre alle informazioni sulla sessione che possono influire sulla presentazione .
Un approccio più robusto potrebbe essere quello di fare qualcosa di simile:
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
Questo si presentava nella vista come qualcosa di simile:
<% ProfilePresenter.new(self, @profile) do |profile| %>
<div><%= profile.link %>
<% end %>
È possibile semplificare la chiamata a questo facendo un aiutante metodo che fa qualcosa di leggermente pazzo come:
def presenter_for(model)
"#{model.class}Presenter".constantize.new(self, model) do |presenter|
yield(presenter) if (block_given?)
end
end
Questo significa che hai un modo molto più semplice call:
<% presenter_for(@profile) do |profile| %>
<div><%= profile.link %>
<% end %>
Questo è un approccio molto bello. Pulito. Stai usando qualcosa di simile ora? – nathanvda
Non è più semplice da usare: "@ profile.presenter.get_url" ed è pronto per partire? oppure potrebbe essere più compresso come: "@ profile.pr.get_url". Questo perché non uso così tanto nei loop ma in altre cose quindi l'uso sarebbe: "presenter_for (@profile) .get_url" –
@nathanvda Ho usato approcci come questo prima con i wrapper, anche se non hanno seguito il Modello presentatore da vicino. Questa è una tecnica per collegare i mondi Modello e Vista. – tadman