Render partial

Ciao,
ho dei problemi con i render partial. Ho provato a scrivere un menu
dinamico, in un partial. Il mio è sicuramente un problema legato ad
inesperienza.
Le voci del menu caricano un elenco di funzionalità associate, al tipo
di utente che si è loggato al sistema.
Il punto di tutto è che l’array che contiene le voci del menu, è
istanziato nel metodo index del controller della pagina iniziale. Nel
momento in cui cambio vista, i relativi metodi del del controller non
contengono + l’array, per un problema di visibilità delle variabili
d’istanza, l’array risulta nullo.
Come posso indicare all’interno del render partial _menu.html.erb che
deve caricare l’array da un certo controller ed una certa azione, senza
dover riscrivere il codice in ogni metodo di ogni controller… violando
in maniera il DRY?
Sicuramente potrebbe essere che sto sbagliando ad usare il render
partial, o non conosco il modo x fare quello che voglio. Comunque ogni
suggerimento è ben accetto.
Grazie
Vi allego uno stralcio del codice:
------ application.rhtml ------------

#caricamento del partial ‘menu’

<%= render :partial => "layouts/menu" %>

----- _menu.html.erb ----------------
<% if logged_in? %>
<% for item in @vocimenu %>
<%= item.name %>
<% end %>
<% end %>

#dove @vocimenu viene caricato nel controller della home page della mia
#applicazione. Non appena cambio vista, l’array @vocimenu è nullo.

Tonino Tumolo

Ciao Tonio,

Il giorno 12/mag/08, alle ore 22:49, Tonino Tumolo ha scritto:

Il punto di tutto è che l’array che contiene le voci del menu, è
istanziato nel metodo index del controller della pagina iniziale. Nel
momento in cui cambio vista, i relativi metodi del del controller non
contengono + l’array, per un problema di visibilità delle variabili
d’istanza, l’array risulta nullo.

Questo è perché il web e “stateless” - quindi il oggetto del
controller che ha eseguito “index” è (o può essere) gettato via quando
la azione “index” e finito (e allora è buttato via anche il tuo
array). L’unico modo per tenere oggetti tra diverse azione è di
mettergli nel hash della sessione.

Un altro modo per creare il tuo menu potrebbe essere un “before
filter” - codice che è eseguito primo di ogni azione. Per avere un
filter (o qualcos’altro) in tutti i controller, metterlo nel
“application.rb” - questo file contiene la superclasse per tutti i
controller nella tua applicazione.

Ciao,
Daniel

Grazie
----- _menu.html.erb ----------------
Tonino Tumolo

Posted via http://www.ruby-forum.com/.


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Daniel H.
Software Architect
[email protected]

Net7
Via Marche 8a - 56123 Pisa

L’unico modo per tenere oggetti tra diverse azione � di
mettergli nel hash della sessione.

Ciao Daniel, ti ringrazio innanzitutto per la risposta.
Inizialmente ci avevo pensato a questa soluzione, ma la vedevo troppo
pesante e quindi avevo optato per l’idea di effettuare in ogni pagina
(nel _menu.html.erb) una verifica su una variabile di sessione che mi
traccia se l’utente è loggato o meno, e ad ogni refresh della pagina
andare ad eseguire quel codice (contenuto in un controller), che mi
ritornasse l’array delle voci da caricare per un certo utente.
Il fatto cmq di portarsi nella sessione un hash-table di una ventina di
items non potrebbe essere un po’ pesante?
Quali potrebbero essere gli svantaggi?

Ciao
Tonino Tumolo

Ciao,

si, è migliore di non tenere troppo nella sessione. (Ricordi anche che
il default di Rails 2.0 salva le sessione in un cookie, limitando la
larghezza a 4kb, e l’utente può vedere i contenuti del cookie). Quindi
salva nella sessione solo i dati che non puoi raggiungere in nessun
altro modo.

Per il tuo menu: Puoi salvare “login: si o no” nella sessione e
mettere un before_filter nel controllers/application.rb - il filter
può creare il array nel controller prima di ogni azione. (Metti anche
i accessors nel application.rb per il array, ovviamente :wink:

Ciao,
Daniel

Il giorno 13/mag/08, alle ore 12:09, Tonino Tumolo ha scritto:


Daniel H.
Software Architect
[email protected]

Net7
Via Marche 8a - 56123 Pisa