Se l’utente non ha un valore di default, nel senso che per la sola
visualizzazione non faccio login (uso devise con ldap), devo per forza
controllare…if…se esiste una sessione utente oppure no per
visualizzare un partial piuttosto che un altro.
Due soluzioni, che non si escludono ma anzi sono complementari:
In application_controller, un before_filter che fa qualcosa del tipo:
@current_role = current_user.try(:role) || :guest
Nelle view, invece di scrivere direttamente
= render “header_#{@current_role}”
usare piuttosto un helper, tipo:
= render_part(‘header’)
L’helper pu quindi ad esempio controllare che il partial esista e in
caso contrario mostrare il default, che so, _header_guest.
se levi current_user potresti ricevere un missing_method for nil class.
Sembra una cosa banale ma ho visto molti errori dovuti a questa cosa. Di
solito e meglio scrivere i test sia per un utente loggato sia per quando e guest
i test…gran bella faccenda…perdo piu’ tempo a fare i
test che non a scrivere direttamente il codice e testarlo sul
campo…ok ok…lapidatemi adesso
Scusate ancora.
Il caso esposto riguarda due diversi tipi di organizzazione, uno che
prevede l’uso da parte di admin e uno che prevede l’uso di utenti
normali senza necessita’ di login.
Se gli usi fossero piu’ di uno?
Amministrazione;
visualizzazione in intranet;
visualizzazione in internet.
Tre diversi layout.
La gestione degli ultimi due potrebbe anche essere la stessa, nel
senso che sono sempre in sola visualizzazione, ma se un domani mi si
chiedesse di modificarne uno…
Il suggerimento riguardo l’uso dei partial e’ ottimo, col
before_filter nell’application controller per settare un ruolo di
default ma se avessi bisogno di 3 diverse views?
A questo punto meglio avere controller/views separati per ciascun caso
o proseguire sulla falsa riga suggerita prevedendo pero’ un ruolo
aggiuntivo (anziche’ admin e guest, admin, intranet e internet)?
Se e` una applicazione aziendale credo che tutti gli utenti debbano
essere loggati, quindi basta un before_filter nel
application_controller:
unless current_user redirect_to ‘/’
Altrimenti se non tutte le pagine richiedono un utente, nel suo
controller (con before_filter o nella action) vedifica sempre che
l’utente ci non sia nil come sopra oppure usando il metodo di devise:
Questione di gusti… ti puoi sbizzarrire L’importante e` di testare
sempre l’oggetto che non sia nil:
if current_user && current_user.admin?
se levi current_user potresti ricevere un missing_method for nil class.
Sembra una cosa banale ma ho visto molti errori dovuti a questa cosa. Di
solito emeglio scrivere i test sia per un utente loggato sia per quando e guest