Complessa o profonda bagagli Oggetto in Ramaze sessione è rotto?
Domanda
(questa è relativa al quadro Ramaze.net)
Mi sono imbattuto in alcuni veramente strani problemi durante la memorizzazione oggetti personalizzati in sessione. Ho notato che solo gli attributi sugli oggetti immediatamente memorizzati in sessione sono stati in fase di aggiornamento. Tuttavia, se questi oggetti contenuti riferimenti ad altri oggetti, di quelli richiamati oggetti non sono stati aggiornati se gli oggetti immediati contenuti in sessione non è cambiata durante la richiesta.
Questo problema solo è diventato evidente per me quando si utilizza Ramaze :: FileCache come la mia sessione di caching backend. Credo che il problema è mascherato o no un problema quando si utilizza sessioni in-memoria.
ho scoperto che il problema è a causa di una "copia superficiale" nella sessione logica trovata in Ramaze :: Session :: Hash # method_missing (Lib / ramaze / corrente / session / hash.rb).
Come un rapido test per assicurarsi che il mio pensiero è stato corretto, ho commentato fuori il "controllo di differenza", in sostanza, costringendo sessione da aggiornare ogni volta.
def method_missing(*args, &block)
old = @hash.dup
result = @hash.send(*args, &block)
#unless old == @hash
Cache.sessions[@session.session_id] = self
#end
result
end
Questo piccolo hack risolto il mio problema. Ora le mie domande sono:
- è una soluzione sicura e ragionevole?
- Devo solo evitare di memorizzare oggetti complessi / profonde nella sessione?
- C'è qualcosa che mi manca?
Soluzione
Questo problema è stato risolto nel più recente Ramaze (2.009,04), si prega di presentare una patch al Ramaze issue tracker se il problema persiste.