# Nell'helper o nel modello?

**URL:** <https://www.ruby-forum.com/t/nellhelper-o-nel-modello/176921>\
**Category:** IT\
**Created:** [October 8, 2009, 10:45am UTC](https://www.ruby-forum.com/t/nellhelper-o-nel-modello/176921 "2009-10-08T10:45:45Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![pm3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/a87d85/32.png) [@pm3](https://www.ruby-forum.com/u/pm3)\
**Post date:** [October 8, 2009, 10:45am UTC](https://www.ruby-forum.com/t/nellhelper-o-nel-modello/176921/1 "2009-10-08T10:45:45Z")

</div>

Chiedo lumi per sapere se c’Ã¨ una soluzione elegante a un banale  
problema che ricorre tante volte. Faccio un esempio tra i mille  
possibili.

C’Ã¨ un modello Model con un campo status. Nelle view in base allo status  
si mostrerÃ un’icona (es: rossa per status disabilitato, verde per  
status abilitato, etc).

Posso creare un helper status\_for\_mymodel a cui passo l’oggetto Model e  
che ritorna l’image\_tag appropriata. Oppure posso creare un metodo  
icon\_tag in Model e fargli ritornare l’immagine. Nella view poi scriverÃ²  
@oggetto.icon\_tag

La prima soluzione Ã¨ piÃ¹ MVC ed Ã¨ quello che faccio di solito, ma non Ã¨  
il massimo trovarsi tutti quei metodi status\_for\_x, quando i modelli in  
questione sono parecchi. Inoltre Ã¨ poco object oriented. La seconda lo Ã¨  
molto di piÃ¹ e sarebbe piÃ¹ bella da leggere. Per contro Ã¨ difficile  
accedere ad image\_tag da dentro un modello.

Magari c’Ã¨ una terza e piÃ¹ elegante soluzione. Voi che fate normalmente?

Paolo

---

<div class="post-metadata">

**Author:** ![pm3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/a87d85/32.png) [@pm3](https://www.ruby-forum.com/u/pm3)\
**Post date:** [October 8, 2009, 10:55am UTC](https://www.ruby-forum.com/t/nellhelper-o-nel-modello/176921/2 "2009-10-08T10:55:42Z")

</div>

2009/10/8 Paolo M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> C’è un modello Model con un campo status. Nelle view in base allo status  
> si mostrerà un’icona (es: rossa per status disabilitato, verde per  
> status abilitato, etc).
> 
> Posso creare un helper status\_for\_mymodel a cui passo l’oggetto Model e  
> che ritorna l’image\_tag appropriata. Oppure posso creare un metodo  
> icon\_tag in Model e fargli ritornare l’immagine. Nella view poi scriverò  
> @oggetto.icon\_tag

la tecnica che uso e’ una variazione sulla seconda strada che indichi,  
in pratica separo le definizione di quale ‘icona’ usare dall’output  
del tag image (o dell’url se e’ per quello), facendolo in maniera  
uniforme sui diversi modelli (i.e. usando lo stesso metodo)

e.g.

class ModelA  
def icon\_name  
case status  
…  
end  
end

class ModelB  
def icon\_name  
case this\_other\_status  
…  
end  
end

e poi l’helper diventa lo stesso per tutti i modelli:

def icon\_for(model, options)  
image\_tag(model.icon\_name, options)  
end

quindi nella pagina avrai

\<%= icon\_for model, options %\>

insomma il metodo icon\_name dei modelli mappa l’istanza del modello  
nello ‘spazio’ delle possibili icone ( non e’ detto poi che l’output  
debba essere direttamente il nome dell’icona sul file system, potrebbe  
essere ‘un puntatore’ all’icona giusta, i.e. ci potrebbe essere di  
mezzo un’altra indirezione )

che ne dici?  
ciao  
Luca

---

<div class="post-metadata">

**Author:** ![pm3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/a87d85/32.png) [@pm3](https://www.ruby-forum.com/u/pm3)\
**Post date:** [October 8, 2009, 10:56am UTC](https://www.ruby-forum.com/t/nellhelper-o-nel-modello/176921/3 "2009-10-08T10:56:17Z")

</div>

Il 08 ottobre 2009 10.45, Paolo M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> icon\_tag in Model e fargli ritornare l’immagine. Nella view poi scriverò  
> @oggetto.icon\_tag
> 
> La prima soluzione è più MVC ed è quello che faccio di solito, ma non è  
> il massimo trovarsi tutti quei metodi status\_for\_x, quando i modelli in  
> questione sono parecchi. Inoltre è poco object oriented. La seconda lo è  
> molto di più e sarebbe più bella da leggere. Per contro è difficile  
> accedere ad image\_tag da dentro un modello.
> 
> Magari c’è una terza e più elegante soluzione. Voi che fate normalmente?

Il problema si può scomporre logicamente in due parti, ovvero:

1. determinare lo stato di un modello;
2. disegnare l’icona per un certo stato.

Il primo problema è compito del modello, il secondo è compito dell’helper.

La mia proposta è quindi che tutti i model che hanno uno stato  
rappresentabile graficamente discendano da un capostipite che  
definisce il metodo stato, il quale dovrebbe restituire un simbolo (se  
sono pochi) o un oggetto, fai tu.

A questo punto scrivi un unico helper che riceva un ModelloConStato,  
si faccia dare da questo lo stato e disegni l’icona conseguentemente.

In questo modo il codice è sia MVC che object oriented; l’informazione  
sullo stato del modello sta nel modello, l’informazione sull’icona sta  
nell’helper.

Piccolo appunto: se non sbaglio, stato nel senso di disabilitato,  
abilitato etc. in inglese è state, non status.

pietro

---

<div class="post-metadata">

**Author:** ![pm3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/a87d85/32.png) [@pm3](https://www.ruby-forum.com/u/pm3)\
**Post date:** [October 8, 2009, 11:06am UTC](https://www.ruby-forum.com/t/nellhelper-o-nel-modello/176921/4 "2009-10-08T11:06:16Z")

</div>

Il 08 ottobre 2009 10.55, Pietro G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> La mia proposta è quindi che tutti i model che hanno uno stato  
> rappresentabile graficamente discendano da un capostipite che  
> definisce il metodo stato, il quale dovrebbe restituire un simbolo (se  
> sono pochi) o un oggetto, fai tu.

Rileggendomi, mi sembra di essere stato poco chiaro, qui.

Ruby è sì un linguaggio a oggetti, ma ha delle particolarità rispetto  
ad altri linguaggi.  
In altri linguaggi si farebbe come ho detto, oppure (forse più  
propriamente) si farebbe implementare a ogni model interessato una  
certa interfaccia; in Ruby ciò non è necessario, basta in genere  
definire un metodo e poi usare respond\_to?(:metodo), che è comodo ma  
niente affatto OO, e a me

155.kind\_of? Numeric

sembra più corretto di

155.respond\_to? “/”

Insomma, fai un po’ tu.

pietro

---

<div class="post-metadata">

**Author:** ![pm3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/a87d85/32.png) [@pm3](https://www.ruby-forum.com/u/pm3)\
**Post date:** [October 8, 2009, 3:12pm UTC](https://www.ruby-forum.com/t/nellhelper-o-nel-modello/176921/5 "2009-10-08T15:12:43Z")

</div>

volendo gli puoi far svolgere comunque l’operazione assumendo che tutto  
sia corretto, e agire con “rescue” se qualcosa va storto, in questo modo  
puoi applicare un duck-typing abbastanza _liberal_ (cit.)

su “The Ruby P.ming Language” c’è un esempio di come si potrebbero  
confrontare due classi Point(x,y) applicando questo tipo di duck typing:

def ==(o)  
@x == o.x && @y == o.y # assume che “o” abbia i metodi “x” e “y”  
rescue # se poi l’assunzione fosse sbagliata…  
false  
end

ciao,  
A.

Pietro G. ha scritto:

---

<div class="post-metadata">

**Author:** ![pm3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/a87d85/32.png) [@pm3](https://www.ruby-forum.com/u/pm3)\
**Post date:** [October 8, 2009, 11:19pm UTC](https://www.ruby-forum.com/t/nellhelper-o-nel-modello/176921/6 "2009-10-08T23:19:40Z")

</div>

Alessandro S. wrote:

> Ciao!  
> a me Ã¨ capitato spesso, la soluzione che applico di solito (se non si  
> tratta di un campo di un singolo modello) Ã¨ estendere active\_model, cosÃ¬  
> tutti i miei model hanno il metodo “icon\_name” che restituisce ciÃ² che  
> serve.  
> A quel punto puÃ² non servire neanche fare un helper, se devi mostrare un  
> immagine basta che usi image\_tag(model.icon\_name, options) direttamente

Mi sa che alla fine adotterÃ² la soluzione di Alessandro. Pure quella di  
Luca mi piaceva ma questa Ã¨ piÃ¹ coincisa. CambierÃ² solo il nome del  
metodo in status\_icon cosÃ¬ mi ricordo di che si tratta. Quella di Piero  
invece Ã¨ un po’ piÃ¹ complessa anche se molto OO.

Grazie a tutti!  
Paolo

---

<div class="post-metadata">

**Author:** ![pm3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/a87d85/32.png) [@pm3](https://www.ruby-forum.com/u/pm3)\
**Post date:** [October 8, 2009, 12:21pm UTC](https://www.ruby-forum.com/t/nellhelper-o-nel-modello/176921/7 "2009-10-08T12:21:44Z")

</div>

Ciao!  
a me Ã¨ capitato spesso, la soluzione che applico di solito (se non si  
tratta di un campo di un singolo modello) Ã¨ estendere active\_model, cosÃ¬  
tutti i miei model hanno il metodo “icon\_name” che restituisce ciÃ² che  
serve.  
A quel punto puÃ² non servire neanche fare un helper, se devi mostrare un  
immagine basta che usi image\_tag(model.icon\_name, options) direttamente

> class ModelA  
> def icon\_name  
> case status  
> …  
> end  
> end
> 
> class ModelB  
> def icon\_name  
> case this\_other\_status  
> …  
> end  
> end
> 
> e poi l’helper diventa lo stesso per tutti i modelli:
> 
> def icon\_for(model, options)  
> image\_tag(model.icon\_name, options)  
> end
> 
> quindi nella pagina avrai
> 
> \<%= icon\_for model, options %\>
