Conversioni before_save


#1

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?
:-/


#2

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 removed_email_address@domain.invalid wrote:

secondi, “48h” = 48 ore = 48*3600 ecc.
:-/
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


Paolo D.’
SeeSaw | Another point of view


removed_email_address@domain.invalid
personal http://paolodona.blogspot.com


#3

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?
:-/


#4

On 1/17/07, david removed_email_address@domain.invalid 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


#5

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]removed_email_address@domain.invalid
[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:removed_email_address@domain.invalid
  2. http://lists.ruby-it.org/mailman/listinfo/ml