# Cosa sono le variabili virtuali?

**URL:** <https://www.ruby-forum.com/t/cosa-sono-le-variabili-virtuali/134444>\
**Category:** IT\
**Created:** [April 10, 2008, 9:45pm UTC](https://www.ruby-forum.com/t/cosa-sono-le-variabili-virtuali/134444 "2008-04-10T21:45:01Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 10, 2008, 9:45pm UTC](https://www.ruby-forum.com/t/cosa-sono-le-variabili-virtuali/134444/1 "2008-04-10T21:45:01Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

Come da oggetto, vorrei capire bene il significato di variabile  
virtuale… ad esempio

def variabile  
@variabile  
end

Vi ringrazio.

* * *

Matteo Buferli  
WEB: [http://www.buferli.com](http://www.buferli.com)  
PGP FINGERPRINT: B7C9 BE0A F77F 4747 56A2 87EC F6E5 8A01 65BB 58C1  
-----BEGIN PGP SIGNATURE-----  
Version: GnuPG v1.4.6 (GNU/Linux)  
Comment: Using GnuPG with Mozilla - [http://enigmail.mozdev.org](http://enigmail.mozdev.org)

iD8DBQFH/m4M9uWKAWW7WMERAkEHAJ0WHAHGoAt3Hkp9RCA9wJc16XeJVgCffPvR  
D058QVVEWWQ0dmqlXMWl6vg=  
=TDEl  
-----END PGP SIGNATURE-----

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 10, 2008, 9:54pm UTC](https://www.ruby-forum.com/t/cosa-sono-le-variabili-virtuali/134444/2 "2008-04-10T21:54:23Z")

</div>

quando metti la chiocciola prima del nome della variabile, rendi  
quella variabile disponibile nella tua view.

es:

def test  
@aaa = “ciao ciao”  
bbb = “dadadsads”  
end

tu nella view potrai usare solo @aaa, bbb sarà valida solo all’  
interno del metodo del controller.

\<%= @aaa %\> questo quando la view viene processata diventa “ciao ciao”

Saluti Q

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 10, 2008, 10:05pm UTC](https://www.ruby-forum.com/t/cosa-sono-le-variabili-virtuali/134444/3 "2008-04-10T22:05:34Z")

</div>

Non ho mai sentito la definizione ‘variabile virtuale’ prima d’ora.  
Nell’esempio che posti, nello scope corrente puoi usare la funzione  
‘variabile’ per recuperare il valore di @variabile, ma non puoi  
impostarne il valore tramite ad esempio ‘variabile=foo’.  
Per fare questo dovresti creare un’altra funzione tipo.

def variabile=(valore)  
@variabile=valore  
end

E’ quello che viene fatto automaticamente dal metodo attr\_accessor.  
Si tratta dell’equivalente delle funzioni getter e setter di java e  
affini.  
Forse è questo che intendi con virtuale, visto che a volte nel codice  
non è immediatamente possibile distinguere se con variabile=foo sto  
agendo su una variabile locale o su un metodo accessor.

Il giorno 10/apr/08, alle ore 21:44, Matteo Buferli ha scritto:

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 10, 2008, 11:05pm UTC](https://www.ruby-forum.com/t/cosa-sono-le-variabili-virtuali/134444/4 "2008-04-10T23:05:37Z")

</div>

On Apr 10, 2008, at 10:56 PM, Luca G. wrote:

> Io ho letto di “variabili virtuali” è un nome dato agli attributi di  
> istanza di una sottoclasse di ActiveRecord::Base, che non sono il  
> risultato di una mappatura di un attributo di una tabella.

Allora al limite saranno ATTRIBUTI virtuali 🙂

> Mi pare sia presente in restful\_authentication, l’attributo password  
> di  
> User in un commento viene appellato come virtuale.

In parole molto povere sono attributi “di appoggio” che vivono  
tipicamente solo durante  
la creazione dei modelli, come “password” in questo caso (e’ la  
password in chiaro  
inserita dall’utente, mentre sul database viene salvata la versione  
criptata).  
Un altro esempio e’ \<nome\_attributo\>\_confirmation, che serve per la  
validazione con  
validates\_confirmation\_of :nome\_attributo

S.

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 10, 2008, 10:56pm UTC](https://www.ruby-forum.com/t/cosa-sono-le-variabili-virtuali/134444/5 "2008-04-10T22:56:47Z")

</div>

Io ho letto di “variabili virtuali” è un nome dato agli attributi di  
istanza di una sottoclasse di ActiveRecord::Base, che non sono il  
risultato di una mappatura di un attributo di una tabella.

Mi pare sia presente in restful\_authentication, l’attributo password di  
User in un commento viene appellato come virtuale.

Luca

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 11, 2008, 1:06am UTC](https://www.ruby-forum.com/t/cosa-sono-le-variabili-virtuali/134444/6 "2008-04-11T01:06:53Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

Perfetto, utilissimi come sempre.  
Ne approffito data l’ora e vedendo che non riesco a uscirne, sto  
implementando un login come avrete immaginato, ma non mi e’ ben chiara  
una cosa

codice

def login  
session[:user\_id] = nil  
if request.post?  
user = User.authenticate(params[:name], params[:password])  
if user  
# perche’ :user\_id?  
session[:user\_id] = user.id  
redirect\_to(:action =\> index)  
else  
flash[:notice] = “Invalid user/password combination”  
end  
end  
end

def index  
# voglio @person  
end

I miei account user, hanno un campo person\_id a cui fanno riferimento  
per le credenziali e quant’altro, ora io nel def index vorrei

1. avere quella persona in @person ad esempio
2. verificarne il type
3. in base al type mandarlo all’index del controller specifico

Ora io sono alle prime armi e chiedo scusa per l’ignoranza, oltre ai  
problemi implementativi qui di sopra, non riesco a capire il significato  
di  
session[:user\_id] = user.id  
e penso inoltre che il mio problema principale sia il non capire come  
vengono passati i dati tra

- da def a def (come sopra)
- da view a def
- da view a def

Vi ringrazio vivamente.

Buonanotte!

* * *

Matteo Buferli  
WEB: [http://www.buferli.com](http://www.buferli.com)  
PGP FINGERPRINT: B7C9 BE0A F77F 4747 56A2 87EC F6E5 8A01 65BB 58C1  
-----BEGIN PGP SIGNATURE-----  
Version: GnuPG v1.4.6 (GNU/Linux)  
Comment: Using GnuPG with Mozilla - [http://enigmail.mozdev.org](http://enigmail.mozdev.org)

iD8DBQFH/p1h9uWKAWW7WMERAnCNAJ46aEN7hMjRy3v64QcHLPgrZQv6bACeMiUk  
ueZJvnWs4zd70Ev2W4kD5XM=  
=vod/  
-----END PGP SIGNATURE-----

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 11, 2008, 10:16am UTC](https://www.ruby-forum.com/t/cosa-sono-le-variabili-virtuali/134444/7 "2008-04-11T10:16:17Z")

</div>

Ciao Matteo,  
Per rispondere alla domanda sull user\_id in sessione, ti rimando a  
questo tutorial: Danger of model in session  
([#13 Dangers of Model in Session - RailsCasts](http://railscasts.com/episodes/13)).

Se vuoi ottenere Person associato ad User, devi modellare così le tue  
classi:

class Person \< ActiveRecord::Base  
has\_one :user  
end

class User \< ActiveRecord::Base  
belongs\_to :person  
end

In questo modo ti basta invocare: @user.person

I dati non vengono “passati” da metodo a metodo del controller.  
Quando ActionController riceve una request, crea una nuova istanza del  
tuo controller, per cui tutti gli attributi decorati con ‘@’ (d’istanza)  
sono visibili in tutti i metodi. Ovviamente sono visibili per il tempo  
in cui la request viene servita. Perché dopo viene distrutta  
quell’instanza del controller, in modo da servire la prossima richiesta.

Per quanto riguarda il passaggio alla view, devi sapere che Rails usa  
ERB per renderizzare le pagine, semplicemente effettuando un bind con  
tra il controller ed il tuo template (index.html.erb). Quindi, anche  
stavolta le variabili d’istanza sono “visibili” nei templates associati.

Spero d’essere stato chiaro.

Luca

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 11, 2008, 11:13am UTC](https://www.ruby-forum.com/t/cosa-sono-le-variabili-virtuali/134444/8 "2008-04-11T11:13:16Z")

</div>

Matteo Buferli wrote:

> Ora io sono alle prime armi e chiedo scusa per l’ignoranza, oltre ai  
> problemi implementativi qui di sopra, non riesco a capire il significato  
> di  
> session[:user\_id] = user.id

Cosa non hai capito?  
Era la stessa cosa scrivere:  
session[‘ilmiouserid’] = user.id

lo scopo Ã¨ memorizzare l’id dello user in una variabile di sessione per  
capire successivamente se l’utente ha effettuato il login.
