Problemi con Symbol: Leggendo il valore mi ritorna --- :simb


#1

Salve a tutti,

Ho un modello in Rails che ha alcuni campi assegnati per mezzo di:

istanza.nome_campo = :valore

Orbene, per tutti i campi tranne uno, quando vado a recuperare il valore
dello stesso mi ritorna correttamente la rappresentazione in stringa del
simbolo assegnato.
Dico correttamente perchè il campo è dichiarato come stringa nella
migration.

Il campo che ha il comportamento anomalo mi restituisce:

— :valore

Le assegnazioni per i campi di cui sopra, vengono tutte fatte in un
unico punto del controller.

Ho già fatto ricerche con grep e con TexMate per vedere se, da qualche
parte nel progetto, abbia modificato qualcosa per quel campo in
particolare. Sfortunatamente, non trovo nulla.

Aggiungo che, se eseguo l’assegnazione dalla console di Rails, il
problema non si manifesta.

Da cosa potrebbe dipendere?


#2

Il campo nel db è stringa ?

Il giorno 12/mag/07, alle ore 11:50, Carmine M. ha scritto:


#3

Giovanni I. wrote:

Il campo nel db � stringa ?

Si, questa è tutta la migration:

create_table :orders do |t|
  t.column :user_id, :integer
  t.column :user_ip, :string
  t.column :created_at, :timestamp
  t.column :updated_at, :timestamp
  t.column :stato, :string, :default => 'aperto'
  t.column :fase, :string
  t.column :spedizione, :string, :default => 'pacco1'
  t.column :pagamento, :string, :default => 'bonifico'
  t.column :indirizzo, :string
  t.column :civico, :integer
  t.column :cap, :integer
  t.column :comune, :string
  t.column :provincia, :string
  t.column :telefono, :string
  t.column :email, :string
  t.column :note, :string
end

E qui l’unico punto dove assegno il campo incriminato: “stato”

def conferma
@order = Order.find(session[:ordine])
@order.stato = :confermato
@order.save!
empty_cart
end

Stò impazzendo per venirne fuori.


#4

Dopo tanto sbattimento ne sono venuto a capo.
Riporto di seguito, a beneficio di quelli che potrebbero avere le mie
stesse lacune.

I campi “non-db” vengono serializzati con YAML. Questo spiega perchè nel
DB, e quindi a video, mi viene restituito: “— :simbolo\n”.

Per ottenere il comportamento da me voluto è bastato aggiungere nella
classe in questione una serie di: “serialize(nome_attributo)”.

In questo modo, ActiveRecord, si occupa della serializzazione e della
successiva deserializzazione dell’attributo specificato.

Phew :slight_smile:

Ed i libri, non ne parlano mai (almeno non quelli che ho letto io).


#5

On May 14, 2007, at 11:38 AM, Carmine M. wrote:

In questo modo, ActiveRecord, si occupa della serializzazione e della
successiva deserializzazione dell’attributo specificato.

Phew :slight_smile:

Ed i libri, non ne parlano mai (almeno non quelli che ho letto io).

Pagina 313 di “Agile programming with Rails”, 2a edizione
Pero’ scusa, se nel campo devi memorizzare un simbolo, perche’ non
memorizzi direttamente
una stringa e poi chiami #intern quando ti serve il simbolo? Cosi’ ti
risparmi i passaggi
di serializzazione/deserializzazione tramite YAML.
Se invece devi memorizzare strutture arbitrarie e non solo simboli,
come non detto.


Stefano C.
removed_email_address@domain.invalid


#6

Stefano C. wrote:

Pagina 313 di “Agile programming with Rails”, 2a edizione

Ecco, appunto :slight_smile: Mi manca la pagina 313 :stuck_out_tongue: (Che memoria di m…)

Pero’ scusa, se nel campo devi memorizzare un simbolo, perche’ non
memorizzi direttamente
una stringa e poi chiami #intern quando ti serve il simbolo? Cosi’ ti
risparmi i passaggi
di serializzazione/deserializzazione tramite YAML.

Hai perfettamente ragione ed, infatti, è quello che farò.
Nella bozza che ho scritto, ho utilizzato i simboli ed è saltato fuori
questa cosetta che mi era completamente sfuggita nella fase di
apprendimento.

Era interessante, per me, capire il perchè del problema.

Fatto ciò, è logico utilizzare il metodo più indolore possibile che, nel
mio caso, è proprio quello della stringa!

Se invece devi memorizzare strutture arbitrarie e non solo simboli,
come non detto.

Grazie per il suggerimento!