Redirect sulla base di un parametro

Gentili Rubisti,
sto sviluppando la mia prima applicazione con Rails e volevo chiedervi
un aiuto.
Ho incluso un LoginController per gestire l’accesso al mio editoriale e
vorrei ridirigere, dopo il login dell’utente registrato, al pannello
writer, editor o admin, sulla base del valore presente nel campo role
della tabella users.
Ma con un semplice ‘case’ non riesco ad ottenere il risultato…
Secondo voi la cosa è fattibile in questi termini? O magari dovrei
gestire la cosa diversamente?
Grazie per le eventuali risposte

Alessandro

On Thu, 22 Jun 2006 18:28:15 +0200, AG wrote:

Ma con un semplice ‘case’ non riesco ad ottenere il risultato…

Cosa vuole dire che “non riesci a ottenere il risultato”?
Immagino che il campo role tu lo popoli. A quel punto guardi cosa ha
current_user.role (dopo il login) e fai il redirect. O non ho capito
qualcosa?

Cosa vuole dire che “non riesci a ottenere il risultato”?
Immagino che il campo role tu lo popoli. A quel punto guardi cosa ha
current_user.role (dopo il login) e fai il redirect. O non ho capito
qualcosa?

Ora funziona, probabilmente avevo sbagliato qualcosa nella sintassi…

case logged_in_user.role
when ‘admin’
redirect_to(:action => ‘index’, :controller => ‘admin’)
when ‘editor’
redirect_to(:action => ‘index’, :controller => ‘editor’)
when ‘user’
redirect_to(:action => ‘index’, :controller => ‘writer’)
end

Ti ringrazio della risposta

Alessandro


E-mail From: Alessandro Ghionna
Operating System GNU/Linux
E-Mail Client: Mutt 1.5.11
Linux - The choice of GNU generation!

On Thu, 22 Jun 2006 19:38:17 +0200, AG wrote:

Ora funziona, probabilmente avevo sbagliato qualcosa nella sintassi…

Può essere, certo. Ora accademicamente discutendo io intravedo una
violazione dell’OCP del tipo più tipico.
Se il tuo modello è tale che non prevedi aggiunte di “ruoli”, secondo i
ben noti principi della programmazione agile va assolutamente bene così
e non ci si schioda.

Mah… Cosa ne dici di

#codice 1
valid_roles = %w{user admin editor}

role = logged_in_user.role || ‘user’
if valid_roles.index role
redirect_to(:action=>index, :controller=>role)
else
# error page
end

La versione totalmente “aperta” sarebbe stata senza usare valid_roles,
ma in questo modo avresti potuto (in mancanza di altri sistemi di
controllo) introdurre una vulnerabilità. Se gli altri controller sono
protetti di loro, allora puoi lanciarti con

role = logged_in_user.role || ‘user’
redirect_to(:action=>index, :controller=>role)

Nell’ipotesi del codice 1, potresti anche avere valid_roles da qualche
parte accessibile da più controller, e fare in modo tale che i
controller dei ruoli (quando ne crei di nuovi) si autoaggiungano
all’array.
Ma la situazione si complica, quindi non è detto che ne valga la pena.

Un’ultima cosa… (questa ancora più generale). Il punto è che è
l’engine e in subordine Rails che invitano a tale violazione. Il codice
di AG è abbastanza naturale da scrivere (per chi non avesse troppa
familiarità con i linguaggi molto dinmici).

La soluzione “classica” sarebbe avere una classe UserQualcosa con
EditorQualcosa e AdminQualcosa sottoclassi che hanno un metodo
defaultController() [ sono passato a nomenclatura Java ].
Quale è il problema? Il problema è che tali classi non esistono e non
vengono nemmeno facilmente inserite nel mondo di Rails. Mi spiego non
so bene dove metterle (e nemmeno se sarebbe il caso di metterle, con il
design di Rails non c’azzeccano e risolvono un problema – nel caso –
inesistente). Ma nel caso, dove andrebbero messe?

On Fri, 23 Jun 2006 10:17:07 +0200, Enrico F. wrote:

La soluzione “classica” sarebbe avere una classe UserQualcosa con
EditorQualcosa e AdminQualcosa sottoclassi che hanno un metodo
defaultController() [ sono passato a nomenclatura Java ].
Quale è il problema? Il problema è che tali classi non esistono e non
vengono nemmeno facilmente inserite nel mondo di Rails. Mi spiego non
so bene dove metterle (e nemmeno se sarebbe il caso di metterle, con il
design di Rails non c’azzeccano e risolvono un problema – nel caso –
inesistente). Ma nel caso, dove andrebbero messe?

Ok, sono un cretino. Probabilmente la soluzione “classica” sarebbe

        +----------------+
        | UserController |
        +----------------+
            A       A
            |       |

±-----------------+ ±----------------+
| EditorController | | AdminController |
±-----------------+ ±----------------+

e poi avere un metodo redirect_to_index chiamabile. Suppongo grosso
modo
così.Anche se nonostante “classica” continua a piacermi di meno della
soluzione “rapida” di chiamata dinamica.
Ecco… vedete, passo a nomenclatura Java, e smetto di ragionare.
:))

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs