# Redirect sulla base di un parametro

**URL:** <https://www.ruby-forum.com/t/redirect-sulla-base-di-un-parametro/64166>\
**Category:** IT\
**Created:** [June 22, 2006, 6:29pm UTC](https://www.ruby-forum.com/t/redirect-sulla-base-di-un-parametro/64166 "2006-06-22T18:29:58Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![AGAGAG](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/22d042/32.png) [@AGAGAG](https://www.ruby-forum.com/u/AGAGAG)\
**Post date:** [June 22, 2006, 6:29pm UTC](https://www.ruby-forum.com/t/redirect-sulla-base-di-un-parametro/64166/1 "2006-06-22T18:29:58Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![AGAGAG](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/22d042/32.png) [@AGAGAG](https://www.ruby-forum.com/u/AGAGAG)\
**Post date:** [June 22, 2006, 7:23pm UTC](https://www.ruby-forum.com/t/redirect-sulla-base-di-un-parametro/64166/2 "2006-06-22T19:23:23Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![AGAGAG](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/22d042/32.png) [@AGAGAG](https://www.ruby-forum.com/u/AGAGAG)\
**Post date:** [June 22, 2006, 7:39pm UTC](https://www.ruby-forum.com/t/redirect-sulla-base-di-un-parametro/64166/3 "2006-06-22T19:39:11Z")

</div>

> 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!

---

<div class="post-metadata">

**Author:** ![AGAGAG](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/22d042/32.png) [@AGAGAG](https://www.ruby-forum.com/u/AGAGAG)\
**Post date:** [June 23, 2006, 10:17am UTC](https://www.ruby-forum.com/t/redirect-sulla-base-di-un-parametro/64166/4 "2006-06-23T10:17:41Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![AGAGAG](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/22d042/32.png) [@AGAGAG](https://www.ruby-forum.com/u/AGAGAG)\
**Post date:** [June 23, 2006, 11:46am UTC](https://www.ruby-forum.com/t/redirect-sulla-base-di-un-parametro/64166/5 "2006-06-23T11:46:17Z")

</div>

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.   
:))
