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?