Использование UTCTime с Гамлетом
Я использую Yesod на своем первом сайте, и у меня есть список новостей:
NewsItem
date UTCTime default=CURRENT_TIME
title String
content String
author String
которые получены в моем обработчике:
newsitems <- runDB $ selectList [] [Desc NewsItemDate]
и в конечном итоге используется в моем шаблоне:
$if null newsitems
<p>No news.
$else
$forall Entity id entry <- newsitems
<article>
<h4>#{newsItemDate entry}
<p>#{newsItemContent entry}
Но я получаю ошибку о типах данных:
Handler/Home.hs:20:11:
No instance for (Text.Blaze.ToMarkup
time-1.4:Data.Time.Clock.UTC.UTCTime)
arising from a use of `toHtml'
Possible fix:
add an instance declaration for
(Text.Blaze.ToMarkup time-1.4:Data.Time.Clock.UTC.UTCTime)
In the first argument of `toWidget', namely
`toHtml (newsItemDate entry_a6ev)'
In a stmt of a 'do' block:
toWidget (toHtml (newsItemDate entry_a6ev))
In the expression:
do { toWidget
((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
"<article><h4>");
toWidget (toHtml (newsItemDate entry_a6ev));
toWidget
((Text.Blaze.Internal.preEscapedText . Data.Text.pack)
"</h4>\
\<p>");
toWidget (toHtml (newsItemContent entry_a6ev));
.... }
Так что я решил пойти дальше и добавить в свой Import.hs:
import Data.Time (UTCTime)
import Data.Time.Format (formatTime)
import Text.Blaze (ToMarkup, toMarkup)
import Text.Blaze.Internal (string)
import System.Locale (defaultTimeLocale)
-- format date as 26 July 2012
instance ToMarkup UTCTime where
toMarkup a = string (formatTime defaultTimeLocale "%e %B %Y" a)
Который компилируется, но выдает ошибку во время выполнения в браузере:
Internal Server Error
PersistMarshalError "Expected UTCTime, received PersistText \"2012-08-30\""
Так что я не уверен, как решить эту проблему, какие-либо идеи?
РЕДАКТИРОВАТЬ: Исходный код сайта, если он нужен или любопытно:https://github.com/iaefai/socrsite