Evitare duplicazione di codice


#1

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?


#2

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


#3

2009/4/29 Andrea (Q) removed_email_address@domain.invalid:

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

:unless cosa…fammi un esempio.


#4

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

:]


#5

cmq leggiti la doc che nn mi ricordo bene.


#6

2009/4/29 Andrea (Q) 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?


#7

restful authentication fa una cosa del genere

def store_location
session[:return_to] = request.request_uri
end


#8

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).


#9

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 :slight_smile:

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