# \[rails\] variabili istanza: scope e duplicazione?

**URL:** <https://www.ruby-forum.com/t/rails-variabili-istanza-scope-e-duplicazione/181319>\
**Category:** IT\
**Created:** [January 9, 2010, 3:41pm UTC](https://www.ruby-forum.com/t/rails-variabili-istanza-scope-e-duplicazione/181319 "2010-01-09T15:41:05Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [January 9, 2010, 3:41pm UTC](https://www.ruby-forum.com/t/rails-variabili-istanza-scope-e-duplicazione/181319/1 "2010-01-09T15:41:05Z")

</div>

Ciao! Sono relativamente nuovo a rails. Sono un programmatore  
javascript/actionscript e conosco un po’ ruby.  
C’Ã¨ una cosa che, sebbene la uso, non capisco perchÃ© funzioni cosÃ¬: le  
variabili istanza (@) perchÃ© in un tipico controller devo ripeterle ad  
ogni azione(metodo)? Non Ã¨ una duplicazione? E perchÃ© la view non mi  
vede una variabile istanza magari giÃ definita in un’altro metodo?

Prendiamo un semplice controller admin, rest, ma vale per tutti.  
Prendiamo le azioni new e create.

def new  
@show = Show.new  
end

def create  
@show = Show.new(params[:show])  
if @show.save  
redirect\_to admin\_shows\_path  
else  
render :new  
end  
end

Per quale motivo sono costretto a dichiarare 2 volte @show come nuova  
istanza di Show? Non Ã¨ forse la stessa? Alla view new passo @show a  
form\_for, il quale raccoglie i dati e li spedisce a create. PerchÃ© in  
create devo creare una nuova istanza di Show?

---

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [January 9, 2010, 4:54pm UTC](https://www.ruby-forum.com/t/rails-variabili-istanza-scope-e-duplicazione/181319/2 "2010-01-09T16:54:02Z")

</div>

Il 09 gennaio 2010 15.41, Luca R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> Ciao! Sono relativamente nuovo a rails. Sono un programmatore  
> javascript/actionscript e conosco un po’ ruby.

ciao

> C’è una cosa che, sebbene la uso, non capisco perché funzioni così: le  
> variabili istanza (@) perché in un tipico controller devo ripeterle ad  
> ogni azione(metodo)? Non è una duplicazione? E perché la view non mi  
> vede una variabile istanza magari già definita in un’altro metodo?  
> […]ciao,  
> Per quale motivo sono costretto a dichiarare 2 volte @show come nuova  
> istanza di Show? Non è forse la stessa? Alla view new passo @show a  
> form\_for, il quale raccoglie i dati e li spedisce a create. Perché in  
> create devo creare una nuova istanza di Show?

Quando hai a che fare con un’applicazione web, devi considerare ogni  
singola richiesta (request) indipendente dalle altre precedenti; ad  
esempio perché ci possono essere thread diversi.  
Anche nel caso di un unico thread, il controller viene comunque  
istanziato di volta in volta.

Dimostrazione:

# app/controllers/prova\_controller.rb

def index  
@mioid = object\_id  
end

# /app/views/prova/index.html.erb

\<%= @mioid %\>

andare su [http://localhost:3000/prova](http://localhost:3000/prova) e fare tante volte reload

Da tutto ciò consegue che, quando viene eseguito un qualunque metodo  
del controller, nessuna variabile d’istanza definita in altri metodi  
action può essere presente.

pietro

---

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [January 9, 2010, 4:58pm UTC](https://www.ruby-forum.com/t/rails-variabili-istanza-scope-e-duplicazione/181319/3 "2010-01-09T16:58:08Z")

</div>

Luca R. ha scritto:

> ```
> redirect_to admin_shows_path
> else
> render :new
> end
> 
> ```
> 
> end
> 
> Per quale motivo sono costretto a dichiarare 2 volte @show come nuova  
> istanza di Show? Non è forse la stessa?  
> innanzi tutto è una questione di scope, @show viene inizializzato quando  
> viene chiamato uno dei due metodi, altrimenti non esisterebbe. considera  
> il fatto che sei libero di usare due variabili con nome differente nei  
> due metodi, perchè non hanno correlazione.  
> Alla view new passo @show a  
> form\_for, il quale raccoglie i dati e li spedisce a create. Perché in  
> create devo creare una nuova istanza di Show?

alla view ‘new’ passi @show che è stata inizializzata nella action ‘new’  
e che andrà in pasto a form\_for.

La action ‘create’ crea una nuova instanza del modello Show passando  
direttamente i parametri che ha ricevuto dalla form (tramite l’array  
params)

spero che ora ti sia più chiaro 😉  
A.

---

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [January 9, 2010, 5:55pm UTC](https://www.ruby-forum.com/t/rails-variabili-istanza-scope-e-duplicazione/181319/4 "2010-01-09T17:55:42Z")

</div>

Grazie a tutti, capito un po’ di piÃ¹! 🙂
