Organizzare una app per differenti usi

Il 23 novembre 2011 09:39, Mauro [email protected] ha scritto:

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.

pietro

2011/11/23 Riccardo T. [email protected]:

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

2011/11/23 Pietro G. [email protected]:

@current_role = current_user.try(:role) || :guest
Bellissimo questo…quante cose devo imparare cavolo.

2011/11/23 Mauro [email protected]:

@current_role = current_user.try(:role) || :guest

Bellissimo questo…quante cose devo imparare cavolo.

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

2011/11/23 Pietro G. [email protected]:

@current_role = current_user.try(:role) || :guest

Perche’ usi il simbolo :guest anziche’ “guest”?

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:

unless user_signed_in? redirect_to ‘/’

Puoi fare il rendering delle view nella action:

if current_user && current_user.admin?
render :text => ‘admin’
elsif current_user
render :text => ‘user’
else
render :text => ‘guest’

Questione di gusti… ti puoi sbizzarrire :slight_smile: 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