Evitare duplicazioni codice

Ciao a tutti! Ho una domanda sulla struttura di un progetto in Rails.
Devo usare lo stesso metodo sia in una vista che nel controller, adesso
ho
definito questo metodo due volte per poterlo usare in entrambi: una
volta
nel controller stesso e una nell’helper.
Uno l’ho definito nel controller in questo modo:

hide_action :metodo
def metodo(parametri)
end

…mentre nell’helperè definito così

def metodo(parametri)
end

La domanda è: come faccio per use lo stesso metodo definendolo una volta
sola?
Grazie a tutti :slight_smile:

Il 18/07/07, Lucea [email protected] ha scritto:

La domanda è: come faccio per use lo stesso metodo definendolo una volta
sola?

Anche se non sono un esperto di rails… dovrebbe andare bene metterlo
solo
nell’helper e poi puoi usarlo anche nel controller senza problemi.

Almeno credo!

Matteo

Ho già provato ma non funziona!

se lo definisco solo nell’helper e poi nel controller lo utilizzo in
questo
modo

metodo(parametri)

mi dà

undefined method `metodo’

Il 18/07/07, Lucea [email protected] ha scritto:

Ho già provato ma non funziona!

se lo definisco solo nell’helper e poi nel controller lo utilizzo in
questo
modo

L’helper è quello associato al controller, ad esempio se hai un controller
ArticlesController l’helper è ArticlesHelper o è diverso?

se questo non fosse il caso devi aggiungere nel controller: helper
TuoHelper

Matteo

L’helper è quello associato al controller, ma non funziona.

Se hai la questa necessità vuol dire che c’è qualche problema di design.

In termini spiccioli: i controller servono a manovrare lo stato
dell’applicazione, mentre la view ha un utilità puramente
presentazionale. Gli helper sono stati ideati per necessità quali la
formattazione di un importo e così via…

La domanda che sorge, a questo punto, è: cos’è che fa quel tuo metodo?

LG

On Mer, Luglio 18, 2007 11:21, Matteo C. wrote:

L’helper è quello associato al controller, ad esempio se hai un
controller
ArticlesController l’helper è ArticlesHelper o è diverso?

se questo non fosse il caso devi aggiungere nel controller: helper
TuoHelper

Gli helper sono visibili solo nelle relative viste.

Nico

Anche se ne abbiamo parlato in chat, riporto anche qui per riferimento.

basta definire il metodo helper che serve nel controller e poi
dichiarare:

helper_method :mio_helper

def mio_helper
#molte cose intelligenti
end

Poi la domanda fatta da Luca sorge spontanea…

Matteo

Ho fatto anche una prova veloce e, a meno di miei errori di distrazione,
il tuo metodo non mi sembra funzionare.

Mi correggo, funziona, avevo letto male. Credevo che quel codice
rendesse
un helper disponibile nel controller, mentre trasforma in helper un
metodo
di un controller.

Nico

On Mer, Luglio 18, 2007 12:01, Matteo C. wrote:

Anche se ne abbiamo parlato in chat, riporto anche qui per
riferimento.

basta definire il metodo helper che serve nel controller e poi
dichiarare:

Ma questa cosa è certa? Sapevo che per utilizzare un helper in un
controller la procedura fosse laboriosa, così tanto che è più comodo
lasciare le cose come sono ed utilizzare gli helper per ciò che sono stati
pensati (le viste).

Ho fatto anche una prova veloce e, a meno di miei errori di distrazione,
il tuo metodo non mi sembra funzionare.

Nico

Gli helper sono dei comuni moduli ruby, quindi per avere a disposizione
i
metodi nei controller dovrebbe essere sufficiente fare un:

class FooController < ApplicationController
include BarHelper

end

Ovvio che se nei metodi dell’helper usate api di ActionView ovvio che
nel
controller non ve li risolve, ma se sono robe vostre tutto dovrebbe
andare.
Paolo

Allora, nella vista faccio qualcosa del tipo

<% for oggetto in @oggetti %>
<% if “condizione in cui uso il metodo”%>

<% end%>
<% end%>

il metodo che mi serve nella vista lo uso nella condizione. La
condizione
non è costante, ma varia a seconda dell’oggetto considerato. Questo metodo
è
uguale a uno di quelli che uso nel controller.
Ecco dunque che per evitare di calcolare tutti risultati nel controller
e
poi passarli alla vista pensavo di usare gli stessi metodi del
controller
nella vista stessa per calcolare i risultati direttamente
lì.
Spero di essermi spiegata…

Lucea ha scritto:

Ecco dunque che per evitare di calcolare tutti risultati nel controller e
poi passarli alla vista pensavo di usare gli stessi metodi del controller
nella vista stessa per calcolare i risultati direttamente lì.

Immaginavo qualcosa di simile, ed è una scelta di design infelice
(IMHO). Perché non ripetta il paradigma MVC, secondo cui la view serve
solo a presentare i dati, ma è il controller che deve occuparsi del
risultato in se.

Quindi questa necessità era un sintomo di qualche cosa che non andava.

Spero di essermi spiegato anch’io. :slight_smile:

LG

capisco perfettamente :slight_smile: