# Evitare duplicazione di codice

**URL:** <https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796>\
**Category:** IT\
**Created:** [April 29, 2009, 5:16pm UTC](https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796 "2009-04-29T17:16:36Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [April 29, 2009, 5:16pm UTC](https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796/1 "2009-04-29T17:16:36Z")

</div>

Ho una action nel controller X che mi restituisce un elenco in base a  
dei parametri inviati da un form.  
In questo controller ho un before\_filter :foo.  
Nella view di un altro controller ho un altro form, anch’esso mi deve  
restituire una lista in base a dei parametri e poiche’ la lista e’  
quasi la stessa il form richiama l’action del controller X.  
Pero’ non dovrebbe eseguire il before filter se tale action viene  
chiamata dal form di questa view.  
E’ possibile fare in modo di sapere da dove proviene una richiesta per  
poter evitare che la before\_filter venga eseguita?

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [April 29, 2009, 5:22pm UTC](https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796/2 "2009-04-29T17:22:27Z")

</div>

dovresti avere l’ opzione :unless da usare con il before filter

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [April 29, 2009, 5:24pm UTC](https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796/3 "2009-04-29T17:24:13Z")

</div>

2009/4/29 Andrea (Q) [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> dovresti avere l’ opzione :unless da usare con il before filter

:unless cosa…fammi un esempio.

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [April 29, 2009, 5:27pm UTC](https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796/4 "2009-04-29T17:27:08Z")

</div>

before\_filter :do\_it, :unless =\> i\_do\_not\_read\_the\_doc

def i\_do\_not\_read\_the\_doc  
return true if brain.empty?  
end

o qualche cosa del genere

:]

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [April 29, 2009, 5:28pm UTC](https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796/5 "2009-04-29T17:28:19Z")

</div>

cmq leggiti la doc che nn mi ricordo bene.

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [April 29, 2009, 5:51pm UTC](https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796/6 "2009-04-29T17:51:48Z")

</div>

2009/4/29 Andrea (Q) [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> cmq leggiti la doc che nn mi ricordo bene.

Si, ok ma…l’action del controller X viene chiamata da un form di  
una view del controller Y.  
Dovrei controllare, se e’ possibile, da chi e’ stata chiamata tale  
action, …se il controller X, al quale appartiene, oppure se  
viene chiamata dal controller Y.  
E’ possibile o faccio prima ad impostare un campo hidden e fare il  
controllo su tale campo?

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [April 29, 2009, 6:59pm UTC](https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796/7 "2009-04-29T18:59:48Z")

</div>

restful authentication fa una cosa del genere

def store\_location  
session[:return\_to] = request.request\_uri  
end

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [April 29, 2009, 6:05pm UTC](https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796/8 "2009-04-29T18:05:55Z")

</div>

Il giorno 29/apr/09, alle ore 17:15, Mauro ha scritto:

> Ho una action nel controller X che mi restituisce un elenco in base a  
> dei parametri inviati da un form.  
> In questo controller ho un before\_filter :foo.  
> Nella view di un altro controller ho un altro form, anch’esso mi deve  
> restituire una lista in base a dei parametri e poiche’ la lista e’  
> quasi la stessa il form richiama l’action del controller X.  
> Pero’ non dovrebbe eseguire il before filter se tale action viene  
> chiamata dal form di questa view.  
> E’ possibile fare in modo di sapere da dove proviene una richiesta per  
> poter evitare che la before\_filter venga eseguita?

Puoi aggirare il problema in modo più elegante imho.

Non richiamare l’action del controller X, ma metti un metodo apposito  
dell’altro controller e per evitare di duplicare codice metti la  
logica condivisa in una funzione di controllers/application.rb (da  
cui entrambi derivano), oppure nella classe del modello appropriato  
(es. se generi una lista di profili, allora forse ci starebbe un  
metodo di classe del modello Profile).

---

<div class="post-metadata">

**Author:** ![msan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/3ab097/32.png) [@msan](https://www.ruby-forum.com/u/msan)\
**Post date:** [April 30, 2009, 8:30am UTC](https://www.ruby-forum.com/t/evitare-duplicazione-di-codice/166796/9 "2009-04-30T08:30:38Z")

</div>

Luigi P. wrote:

> Non richiamare l’action del controller X, ma metti un metodo apposito  
> dell’altro controller e per evitare di duplicare codice metti la  
> logica condivisa in una funzione di controllers/application.rb (da  
> cui entrambi derivano), oppure nella classe del modello appropriato  
> (es. se generi una lista di profili, allora forse ci starebbe un  
> metodo di classe del modello Profile).

Concordo, Ã¨ meglio non mischiare troppo i controller altrimenti si fa  
una spaghettata di URL e seguire il codice dopo qualche settimana  
diventa difficile 🙂

E’ anche bene mettere quanta piÃ¹ logica possibile nei modelli e tenere i  
controller il piÃ¹ vuoti possibile per cui propendo per la seconda  
soluzione.

Nota a margine: a partire da Rails 2.3 controllers/application.rb non  
esiste piÃ¹ ed Ã¨ sostituito da controllers/application\_controller.rb  
(basta fare il rename).

Paolo
