Forum: Italian Ruby user group [rails] variabili istanza: scope e duplicazione?

Posted by Luca Reghellin (stratboy)
on 2010-01-09 15:41
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?
Posted by Pietro Giorgianni (giorgian)
on 2010-01-09 16:54
(Received via mailing list)
Il 09 gennaio 2010 15.41, Luca Reghellin <email@reghellin.com> 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
Posted by Andrea Pavoni (apeacox)
on 2010-01-09 16:58
(Received via mailing list)
Luca Reghellin 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.
Posted by Luca Reghellin (stratboy)
on 2010-01-09 17:55
Grazie a tutti, capito un po' di più! :)
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.