Conversioni before_save

Ciao,
ho un campo in un form che corrisponde ad un campo integer nel DB; il
campo esprime una durata, in secondi. Di conseguenza, quando faccio:
@bagaglio = Bagaglio.new params[:bagaglio]
…la stringa POSTata dal form (perché in origine tutti gli input
sono
stringhe!) viene convertito in Fixnum. Ok.
Voglio permettere l’inserimento di valori in più formati nel form,
indicando con una lettera l’unità di misura. “3g” = 3 giorni =
386400
secondi, “48h” = 48 ore = 48
3600 ecc.
Ho aggiunto un metodo di conversione al modello. Un po’ di regexp che
estrae i numeri e fa le moltiplicazioni del caso. Mi sembrava
naturale
chiamare questo metodo dal before_save hook, ma ecco il mio problema:
quando viene invocato il valore originale del form, ad esempio “3g”,
è
già stato convertito in Fixnum, cioè 3 nel esempio…
Come faccio a eseguire codice direttamente sui dati POSTati? Potrei
farlo nel controller, prima di fare Bagaglio.new(), ma è una
conversione che andrebbe nel model mica nel controller e lo voglio
avere in un solo posto, prima di create/update, ovvero proprio nel
“before_save” o al limite nel “before_validate”.
Idee?
:-/

a suo tempo feci un plugin che salvava i dati moltiplicati per
10,100,1000
su db,
non mi ricordo esattamente dove mi agganciavo, cmq puoi spulciare i
sorgenti, magari ti sono d’aiuto…
http://svn.seesaw.it/pkgs/store_multiplied.tar.gz

Paolo

On 1/17/07, david [email protected] wrote:

secondi, “48h” = 48 ore = 48*3600 ecc.
:-/
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Paolo D.’
SeeSaw | Another point of view

[email protected]
personal http://paolodona.blogspot.com

Io definirei un nuovo attributo nel modello (es formula_durata), da
utilizzare poi nel form, al posto di quello originale.

class Model
def formula_durata=(value)
self.durata_in_giorni=tua_formula(value)
end

def formula_durata
durata_in_giorni
end
end

Ciao
Massimo

david wrote:

Ciao,
ho un campo in un form che corrisponde ad un campo integer nel DB; il
campo esprime una durata, in secondi. Di conseguenza, quando faccio:
@bagaglio = Bagaglio.new params[:bagaglio]
…la stringa POSTata dal form (perché in origine tutti gli input
sono
stringhe!) viene convertito in Fixnum. Ok.
Voglio permettere l’inserimento di valori in più formati nel form,
indicando con una lettera l’unità di misura. “3g” = 3 giorni =
386400
secondi, “48h” = 48 ore = 48
3600 ecc.
Ho aggiunto un metodo di conversione al modello. Un po’ di regexp che
estrae i numeri e fa le moltiplicazioni del caso. Mi sembrava
naturale
chiamare questo metodo dal before_save hook, ma ecco il mio problema:
quando viene invocato il valore originale del form, ad esempio “3g”,
è
già stato convertito in Fixnum, cioè 3 nel esempio…
Come faccio a eseguire codice direttamente sui dati POSTati? Potrei
farlo nel controller, prima di fare Bagaglio.new(), ma è una
conversione che andrebbe nel model mica nel controller e lo voglio
avere in un solo posto, prima di create/update, ovvero proprio nel
“before_save” o al limite nel “before_validate”.
Idee?
:-/

On 1/17/07, david [email protected] wrote:

Ho aggiunto un metodo di conversione al modello. Un po’ di regexp che
estrae i numeri e fa le moltiplicazioni del caso. Mi sembrava naturale
chiamare questo metodo dal before_save hook, ma ecco il mio problema:
quando viene invocato il valore originale del form, ad esempio “3g”, è
già stato convertito in Fixnum, cioè 3 nel esempio…

Prova qualcosa tipo

def before_save
duration = convert_from_funny_formats(duration_before_type_cast)
end

dove convert_from_funny_formats è il tuo metodo

Matteo

Massimo: Avevo pensato all’attributo extra infatti, ma mi sembra poco
elegante, ma è forse il meno peggio…
Matteo: Questo sembra interessante… before_type_cast è forse quello
che cercavo!
david wrote:

Ciao,
ho un campo in un form che corrisponde ad un campo integer nel DB; il
campo esprime una durata, in secondi. Di conseguenza, quando faccio:
@bagaglio = Bagaglio.new params[:bagaglio]
…la stringa POSTata dal form (perché in origine tutti gli input
sono
stringhe!) viene convertito in Fixnum. Ok.
Voglio permettere l’inserimento di valori in più formati nel form,
indicando con una lettera l’unità di misura. “3g” = 3 giorni =
386400
secondi, “48h” = 48 ore = 48
3600 ecc.
Ho aggiunto un metodo di conversione al modello. Un po’ di regexp che
estrae i numeri e fa le moltiplicazioni del caso. Mi sembrava
naturale
chiamare questo metodo dal before_save hook, ma ecco il mio problema:
quando viene invocato il valore originale del form, ad esempio “3g”,
è
già stato convertito in Fixnum, cioè 3 nel esempio…
Come faccio a eseguire codice direttamente sui dati POSTati? Potrei
farlo nel controller, prima di fare Bagaglio.new(), ma è una
conversione che andrebbe nel model mica nel controller e lo voglio
avere in un solo posto, prima di create/update, ovvero proprio nel
“before_save” o al limite nel “before_validate”.
Idee?
:-/

_______________________________________________________________________

Ml mailing list
[1][email protected]
[2]http://lists.ruby-it.org/mailman/listinfo/ml


“Den som väntar pÃ¥ nÃ¥got gott väntar inte för länge. Den som väntar pÃ¥
någon so
m har gått får vänta länge. Den som har väntat för gott har väntat för
länge.”

References

  1. mailto:[email protected]
  2. http://lists.ruby-it.org/mailman/listinfo/ml