Come posso visualizzare un record appena salvato
con il relativo id generato?
Ho questo metodo:
def create
Requirement.new(params[:requirement])) #
@requirement = Requirement.new(params[:requirement])
@requirement.data = DateTime.now #
@requirement.status = 0 #
if @requirement.save
flash[:notice] = 'Richiesta inviata con Id: ’ …
redirect_to :action => ‘index’
else
render :action => ‘new’
end
end
se è stato salvato ne voglio visualizzare l’id.
Come posso fare?
Grazie per la risposta.
BM
Ti direi di aggiungere nel modello una cosa del tipo:
def self.last_insert_id
find_by_sql “SELECT LAST_INSERT_ID()”
end
e poi nel controller
if @requirement.save
flash[:notice] = “Richiesta inviata con Id:
#{@requirement.last_insert_id}”
Occhio ad una cosa che se il database riceve piu’ richieste concorrenti
o fa insert su piu’ tabelle il last_insert_id potrebbe essere non
corretto. Quindi dipende dall’uso che ne fai
Cmq questo e’ se usi MySQL.
per postgres c’e’ gia’:
http://railsmanual.com/class/ActiveRecord%3A%3AConnectionAdapters%3A%
3APostgreSQLAdapter/last_insert_id
ciao
On 8/9/06, Biagio M. [email protected] wrote:
if @requirement.save
Biagio, semplicemente: @requirement.id
Ciao,
Antonio
On Mer, Agosto 9, 2006 17:39, tele wrote:
Occhio ad una cosa che se il database riceve piu’ richieste
concorrenti
o fa insert su piu’ tabelle il last_insert_id potrebbe essere non
corretto.
Si potrebbe usare una transazione ed fare una query per l’ultimo id
inserito prima del commit, così stai sicuro che ottieni quello relativo al
tuo inserimento.
Nico
Antonio C. wrote:
On 8/9/06, Biagio M. [email protected] wrote:
if @requirement.save
Biagio, semplicemente: @requirement.id
Già provato
@requirement.id risulta nil
comunque grazie
Occhio ad una cosa che se il database riceve piu’ richieste concorrenti
o fa insert su piu’ tabelle il last_insert_id potrebbe essere non
corretto. Quindi dipende dall’uso che ne fai
Cmq questo e’ se usi MySQL.
Il problema è proprio questo, ho bisogno dell’effettivo id
del record inserito, se lo vado a rileggere non ho garanzia che
sia proprio quello.
Dovrei recuperare l’id nel momento in cui è generato.
Sono nuovo con Rails e web , vengo da Delphi e C++ e di solito
scindo la registrazione in due fasi: genero l’id lo salvo in variabile
opportuna
e poi salvo il record. Quindi rileggo tramite la variabile che contiene
l’id
(uso firebird)
Grazie comunque …se hai qualche idea …
---------- Forwarded message ----------
From: Antonio C. [email protected]
Date: Aug 9, 2006 5:49 PM
Subject: Re: [ruby-it] Rilettura record
To: [email protected]
On 8/9/06, Biagio M. [email protected] wrote:
if @requirement.save
Biagio, semplicemente: @requirement.id
Come ha detto saggiamente Antonio, ti basta semplicemente usare @
requirement.id dopo che hai salvato il modello, in quanto ti carica
l’id
che tu stai cercando in @requirement proprio dopo il salvataggio.
–Andrea R.
— Biagio M. [email protected] ha scritto:
Antonio C. wrote:
On 8/9/06, Biagio M. [email protected] wrote:
if @requirement.save
Biagio, semplicemente: @requirement.id
Già provato
@requirement.id risulta nil
comunque grazie
allora c’è un problema, temo, e la pagina non è
davvero salvata:
p=Page.new
=> #<Page:0xb76ce6d8 @new_record=true,
@attributes={“updated_at”=>nil, “title”=>“”,
“created_at”=>nil}>
p.save
=> true
p.id
=> 383
class Page
validates_length_of :title, :minimum=>10
end
=>
[#Proc:0xb7abc560@/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validations.rb:296,
:validate_associated_records_for_revisions]
p=Page.new
=> #<Page:0xb76977c8 @new_record=true,
@attributes={“updated_at”=>nil, “title”=>“”,
“created_at”=>nil}>
p.save
=> false
p.id
=> nil
tra l’altro, non c’è bisogno che imposti la data a
mano, basta che usi gli attributi speciali
created_at/created_on/updated_at/updated_on, se
esistono queste colonne nella tua tabella vengono
modificate automaticamente.
–
icq: #69488917
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info
Chiacchiera con i tuoi amici in tempo reale!
Yahoo Search - Ricerca nel Web | Motore di Ricerca
gabriele renzi wrote:
— Biagio M. [email protected] ha scritto:
Antonio C. wrote:
allora c’� un problema, temo, e la pagina non �
davvero salvata:
Il record risulta perfettamente salvato.
Credo che dopo essere salvato venga ripulito.
BM
On 8/9/06, Biagio M. [email protected] wrote:
Il record risulta salvato (lo vedo nel database) ma @requirement.id
risulta nil
e genera il seguente errore:
Called id for nil, which would mistakenly be 4 – if you really wanted
the id of nil, use object_id.
Questo ti dice che nell’action ‘show’ l’oggetto @requirement che passi a
Requirement.find non esiste, per cui ha valore nil.
id e’ anche una forma deprecated di object_id e, nel caso di nil,
restituisce 4.
Controlla il valore di @requirement.id dove sai che l’oggetto esiste,
cioè
nell’action ‘create’ subito dopo if @requirement.save.
Ciao,
Antonio
@requirement rappresenta la tua tupla e grazie all’ORM di ActiveRecord
puoi
sempre accedere ai singoli valori che la costituiscono.
@requirement.id va ovviamente fatto dopo che @requirement.save e’
avvenuto
con successo. Per riprendere il tuo esempio, qualcosa del genere:
if @requirement.save
flash[:notice] = 'Richiesta inviata con Id: #{@requirement.id}"
…
Se questo non funziona, e il record viene inserito nel tuo database, c’è
decisamente qualche problema.
Antonio
Biagio M. wrote:
def show
@requirement = Requirement.find(@requirement.id)
end
Hmm, qui @requirement sara’ nil fino a dopo l’esecuzione del metodo
find! (se lo passi come :id nella richiesta params[:id])
def create
@requirement = Requirement.new(params[:requirement])
if @requirement.save
#flash[:notice] = 'Richiesta inviata con Tichet: ’
redirect_to :action => ‘show’
redirect_to :action => ‘show’, :id=>@requirement
per passare l’id di @requirement
ciao,
Luca
Web: http://spazidigitali.com
Email: mailto://[email protected]
Skype: callto://l.mearelli
Antonio C. wrote:
if @requirement.save
flash[:notice] = 'Richiesta inviata con Id: #{@requirement.id}"
Se questo non funziona, e il record viene inserito nel tuo database, c’�
decisamente qualche problema.
ho reinstallato l’adapter firebirded ora questo codice funziona
if @requirement.save
flash[:notice] = @requirement.id // Mi visualizza id
redirect_to :action => 'show'
else
render :action => 'new'
end
end
questo continua a non funzionare ( errore nil)
def show
@requirement = Requirement.find(@requirement.id) // non funziona va
scritta cosi’?
end
def create
…
if @requirement.save
redirect_to :action => ‘show’
else
render :action => ‘new’
end
end
Ma per il momento mi basta questo.
Grazie a tutti per le risposte
Ciao
On 8/9/06, Biagio M. [email protected] wrote:
ho reinstallato l’adapter firebirded ora questo codice funziona
Ottimo.
questo continua a non funzionare ( errore nil)
end
end
E’ normale che non funziona. In pratica Biagio, l’oggetto @requirement
che
crei all’interno di un metodo del controller non e’ automaticamente
disponibile negli altri metodi.
Per cui devi passare il valore in qualche modo (Luca ti ha mostrato un
modo
che puoi usare da subito).
Piu’ in generale, anticipo la domanda, se la logica dell’applicazione
richiede di avere l’oggetto costantemente disponibile negli altri
metodi,
puoi sempre usare un filtro before_filter :set_my_variable (dove
set_my_variable e’ un metodo privato) nell’application controller. In
questo
modo l’oggetto e’ disponibile per gli altri metodi. Attenzione, non hai
bisogno di tutto questo nel tuo caso specifico.
Ciao,
Antonio
Antonio C. wrote:
On 8/9/06, Biagio M. [email protected] wrote:
ho reinstallato l’adapter firebirded ora questo codice funziona
Ottimo.
questo continua a non funzionare ( errore nil)
end
end
E’ normale che non funziona. In pratica Biagio, l’oggetto @requirement
che
crei all’interno di un metodo del controller non e’ automaticamente
…
Immaginavo che questo errore era dovuto a mia Ruby-ignoranza
Ti ringrazio nuovamente ( a te e agli altri)
Grazie ancora e a risentirci
BM
— Biagio M. [email protected] ha scritto:
Immaginavo che questo errore era dovuto a mia
Ruby-ignoranza
più che ruby è rails-ignoranza, una variabile
d’istanza è visibile agli altri metodi, solo che in
rails ogni volta che accedi ad un’azione viene creato
un nuovo oggetto e quindi le variabili d’istanza che
avevi settato prima non ci sono
più.
–
icq: #69488917
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info
Chiacchiera con i tuoi amici in tempo reale!
Yahoo Search - Ricerca nel Web | Motore di Ricerca
Il 9-08-2006 gabriele renzi ha scritto:
solo che in
rails ogni volta che accedi ad un’azione viene creato
un nuovo oggetto e quindi le variabili d’istanza che
avevi settato prima non ci sono più.
In effetti tenendo conto che spesso e volentieri due action significano
due query diverse e che Rails può girare anche con CGI direi che è
abbastanza naturale che sia così (anche se chiramente si sarebbe potuto
fare altrimenti).
–
blog: http://www.akropolix.net/rik0/blogs | Enrico F.
site: http://www.akropolix.net/rik0/ | RiK0
forum: http://www.akropolix.net/forum/ | Linux Counter: #299198