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?
on 2010-01-09 15:41
on 2010-01-09 16:54
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
on 2010-01-09 16:58
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.
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
Log in with Google account | Log in with Yahoo account
No account? Register here.