# Passaggio variabili al modello

**URL:** <https://www.ruby-forum.com/t/passaggio-variabili-al-modello/132505>\
**Category:** IT\
**Created:** [March 20, 2008, 9:13pm UTC](https://www.ruby-forum.com/t/passaggio-variabili-al-modello/132505 "2008-03-20T21:13:49Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![alexpescara](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b487fb/32.png) [@alexpescara](https://www.ruby-forum.com/u/alexpescara)\
**Post date:** [March 20, 2008, 9:13pm UTC](https://www.ruby-forum.com/t/passaggio-variabili-al-modello/132505/1 "2008-03-20T21:13:49Z")

</div>

Rieccomi,dopo tanto tempo,a scrivere sul forum…Sto cominciando a  
preparare la tesi su rails,quindi credo che avrÃ² molto bisogno di  
aiuto!!!  
Innanzitutto,vorrei sapere se,come per il controller e per l’helper,  
esiste un modo per far “ereditare” del codice a tutti i modelli:in  
pratica,vorrei che un before\_create possa essere scritto una volta per  
tutte e verificato da tutti i modelli.  
PiÃ¹ precisamente,vorrei che il salvataggio di una nuova riga venga  
consentito solo se l’utente ha determinati privilegi. Ma come faccio a  
passare la variabile al modello (supponendo per esempio che la variabile  
sia una sessione?).  
Aspetto un vostro aiuto/suggerimento. Grazie!

---

<div class="post-metadata">

**Author:** ![alexpescara](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b487fb/32.png) [@alexpescara](https://www.ruby-forum.com/u/alexpescara)\
**Post date:** [March 21, 2008, 9:17am UTC](https://www.ruby-forum.com/t/passaggio-variabili-al-modello/132505/2 "2008-03-21T09:17:12Z")

</div>

Alessandro M. wrote:

> Innanzitutto,vorrei sapere se,come per il controller e per l’helper,  
> esiste un modo per far “ereditare” del codice a tutti i modelli:in  
> pratica,vorrei che un before\_create possa essere scritto una volta per  
> tutte e verificato da tutti i modelli.  
> PiÃ¹ precisamente,vorrei che il salvataggio di una nuova riga venga  
> consentito solo se l’utente ha determinati privilegi. Ma come faccio a  
> passare la variabile al modello (supponendo per esempio che la variabile  
> sia una sessione?).  
> Aspetto un vostro aiuto/suggerimento. Grazie!

Sei sicuro di voler “sporcare” il modello con problematiche di  
autorizzazione?

Le operazioni che si effettuano su un dominio non hanno la pretesa di  
essere atomiche.  
Si puo’ chiamare un metodo di un oggetto di modello sapendo che lo stato  
del sistema sara’ temporaneamente instabile.  
E’ per questo che il modello viene blindato con uno strato di servizi (i  
controller, appunto) che gestiscono la transazionalita’ ed altre  
problematiche trasversali, tra cui l’autenticazione.  
Il controller garantisce che ogni servizio da lui esposto mantiene il  
sistema in uno stato stabile, non corrotto.

Inoltre spesso l’autorizzazione viene demandata a sistemi esterni,  
proprio per la trasversalita’ della problematica che suggerisce di  
implementarla in un unico posto a fronte di diverse applicazioni che lo  
usano.

E’ chiaro che se vuoi gestire l’autorizzazione internamente, le entita’  
necessarie all’autorizzazione dovranno far parte del modello.  
Ma vedo rischioso utilizzarle in un before\_create di modello.

Ma veniamo al tuo punto chiave.

L’autorizzazione in before\_create richiede la conoscenza di chi ha  
richiesto l’operazione.  
Se un model.save non contiene questa informazione, il before\_create puo’  
ottenerla solo dal contesto.  
Ovvero da una variabile globale (o di classe), come User.current.  
Ma questo significa sporcare il modello, perche’ un “utente corrente”  
non e’ parte del dominio.  
Un dominio deve essere definito indipendentemente da chi lo usa, o da  
quanti lo usano.

Nelle mie applicazioni l’autorizzazione e’ gestita dal controller in un  
modo simile a questo:

before\_filter :authorize, :except =\> [:register, :login]

dove

def authorize(ctrl = params[:controller], action = params[:action])  
User.find(session[:user]).allowed\_to?({:controller =\> ctrl, :action  
=\> action})  
end

e’ definita in app/controllers/application.rb

---

<div class="post-metadata">

**Author:** ![alexpescara](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b487fb/32.png) [@alexpescara](https://www.ruby-forum.com/u/alexpescara)\
**Post date:** [March 21, 2008, 10:27am UTC](https://www.ruby-forum.com/t/passaggio-variabili-al-modello/132505/3 "2008-03-21T10:27:06Z")

</div>

Claudio Petasecca D. wrote:

> Alessandro M. wrote:
> 
> > Innanzitutto,vorrei sapere se,come per il controller e per l’helper,  
> > esiste un modo per far “ereditare” del codice a tutti i modelli:in  
> > pratica,vorrei che un before\_create possa essere scritto una volta per  
> > tutte e verificato da tutti i modelli.  
> > PiÃ¹ precisamente,vorrei che il salvataggio di una nuova riga venga  
> > consentito solo se l’utente ha determinati privilegi. Ma come faccio a  
> > passare la variabile al modello (supponendo per esempio che la variabile  
> > sia una sessione?).  
> > Aspetto un vostro aiuto/suggerimento. Grazie!
> 
> Sei sicuro di voler “sporcare” il modello con problematiche di  
> autorizzazione?
> 
> Le operazioni che si effettuano su un dominio non hanno la pretesa di  
> essere atomiche.  
> Si puo’ chiamare un metodo di un oggetto di modello sapendo che lo stato  
> del sistema sara’ temporaneamente instabile.  
> E’ per questo che il modello viene blindato con uno strato di servizi (i  
> controller, appunto) che gestiscono la transazionalita’ ed altre  
> problematiche trasversali, tra cui l’autenticazione.  
> Il controller garantisce che ogni servizio da lui esposto mantiene il  
> sistema in uno stato stabile, non corrotto.
> 
> Inoltre spesso l’autorizzazione viene demandata a sistemi esterni,  
> proprio per la trasversalita’ della problematica che suggerisce di  
> implementarla in un unico posto a fronte di diverse applicazioni che lo  
> usano.
> 
> E’ chiaro che se vuoi gestire l’autorizzazione internamente, le entita’  
> necessarie all’autorizzazione dovranno far parte del modello.  
> Ma vedo rischioso utilizzarle in un before\_create di modello.
> 
> Ma veniamo al tuo punto chiave.
> 
> L’autorizzazione in before\_create richiede la conoscenza di chi ha  
> richiesto l’operazione.  
> Se un model.save non contiene questa informazione, il before\_create puo’  
> ottenerla solo dal contesto.  
> Ovvero da una variabile globale (o di classe), come User.current.  
> Ma questo significa sporcare il modello, perche’ un “utente corrente”  
> non e’ parte del dominio.  
> Un dominio deve essere definito indipendentemente da chi lo usa, o da  
> quanti lo usano.
> 
> Nelle mie applicazioni l’autorizzazione e’ gestita dal controller in un  
> modo simile a questo:
> 
> before\_filter :authorize, :except =\> [:register, :login]
> 
> dove
> 
> def authorize(ctrl = params[:controller], action = params[:action])  
> User.find(session[:user]).allowed\_to?({:controller =\> ctrl, :action  
> =\> action})  
> end
> 
> e’ definita in app/controllers/application.rb

E infatti alla fine ieri avevo deciso di fare come hai proposto tu:  
before\_filter :check\_privileges\_for\_create, :only =\> [:new,:create]

Il problema era che ho bisogno di creare del codice “generico”, in cui  
passando la struttura del database (o definendo le tabelle che devono  
essere presenti,con le relative relazioni) viene automaticamente creata  
l’applicazione e anche la gestione dei permessi (quali operazioni sono  
concesse agli utenti, quali campi possono essere  
visualizzati/aggiornati,ecc…). Quindi,pensavo che avvalendomi del  
before\_create si sarebbe potuto astrarre meglio,poichÃ¨ col filtro  
presente nel controller va invece definita a priori l’azione su cui  
eseguire il filtro stesso. In questo caso: se l’utente lascia che le  
azioni per creare una nuova riga si chiamino create va tutto ok,ma se  
l’azione per creare viene chiamata,ad esempio, save? Il filtro non viene  
applicato,se non si aggiunge manualmente anche :save in :only.  
Comunque sia,la parte piÃ¹ difficile viene adesso: a seconda dei  
privilegi,l’utente puÃ² visualizzare/aggiornare solo alcuni dei campi di  
una tabella,quindi bisogna fargli visualizzare solo i campi a cui puÃ²  
avere accesso. Il tutto in modo “generale”,poichÃ¨ il codice deve  
astrarre dall’applicazione. Che Dio mi aiuti!!!
