[rails] variabili istanza: scope e duplicazione?

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?

Il 09 gennaio 2010 15.41, Luca R. [email protected] 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 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

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 :wink:
A.

Grazie a tutti, capito un po’ di più! :slight_smile: