Ho una chiamata ajax che invia json a un instradamento in Yesod e voglio che il percorso analizzi il jSON e lo inserisca direttamente nel database. Nel mio file di modello hoInserisci timestamp di default in fromJson
createtime UTCTime default=now()
che impedisce l'analisi del json poiché il client non invia il tempo di creazione. Ho provato a scrivere il mio parseJson per le voci di registro, ma non sono riuscito a inserire un valore predefinito in UTCTime poiché getCurrentTime restituisce un valore nella monade IO. Mi piacerebbe che il database impostasse il valore, se possibile.
L'unica cosa che posso pensare a questo punto è di creare un tipo come LogEntryWithoutTime, analizzare il JSON in quello e convertirlo in un LogEntry. C'è un modo più semplice?
Modifica: Mostriamo tre diversi errori per aggiungere getCurrentTime all'analisi JSON. In primo luogo, l'intento è quello di analizzare la creatività se disponibile e l'impostazione predefinita su getCurrentTime sul server. Questo non è giusto comunque, dal momento che non dovremmo fare affidamento sul tempo del cliente.
instance FromJSON Log where
parseJSON (Object o) = Log
<$> o .: "userid"
...
<*> o .:? "createtime" .!= liftIO getCurrentTime
L'errore è
Model.hs:58:32:
Couldn't match expected type ‘UTCTime’
with actual type ‘m0 UTCTime’
In the second argument of ‘(.!=)’, namely ‘liftIO getCurrentTime’
In the second argument of ‘(<*>)’, namely
‘o .:? "createtime" .!= liftIO getCurrentTime’
In secondo luogo, cerco di ottenere solo l'ora corrente.
<*> liftIO getCurrentTime
e ottengo l'errore
Model.hs:58:9:
No instance for (MonadIO
aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser)
arising from a use of ‘liftIO’
In the second argument of ‘(<*>)’, namely ‘liftIO getCurrentTime’
Se cambio la linea di
<*> getCurrentTime
allora ottengo
Model.hs:58:9:
Couldn't match type ‘IO’
with ‘aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser’
Expected type: aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser
UTCTime
Actual type: IO UTCTime
Hai scoperto questo problema? Sto lottando con esso ora. –
Siamo spiacenti, non sono stato in grado di trovare una buona soluzione. – user3776949