使用UTCTime哈姆雷特(Using UTCTime with Hamlet)

2019-06-27 19:54发布

我在我的第一个网站使用耶索德和我的新闻项目的列表:

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

Answer 1:

没有调查实际的错误,我认为你的做法是不是很大。 您将很可能最终要格式化的几种方法UTCTime ,毕竟,类型是有存放时间,不只是日期。 通过给ToMarkup UTCTime实例,则全球解决这个问题。

我建议写功能renderAsDate :: UTCDate -> HTMLrenderAsTime :: UTCDate -> HTML等,并在模板中使用它们,例如#{renderAsDate (newsItemDate entry)}

但是,这不会解决运行时错误,这是从序列化层,并有可能独立于你的模板。



Answer 2:

我敢肯定,你可以只使用显示在小村庄? 这是ATLEAST我做了什么?

#{show $ newsItemDate entry}

我以前也碰到这种情况下的东西,和这家伙介绍这里是这样的:

作为这一理念的表达哈斯克尔的节俭不需要类型签名的一部分 - 尽管有经验的Haskeller为他们提供了清晰 - 所以在这种强类型语言类型错误往往是神秘的门外汉。 举例来说,如果你定义一个函数f,增加了两个数字,然后用两个字符串调用它,编译器不会抱怨自己的参数,它会抱怨串不支持运营商加。 它将制定其投诉的问题非常非显而易见的方式。 [1]在 “1. Haskell是简洁” ...

[1] http://fpcomplete.com/ten-things-you-should-know-about-haskell-syntax/



文章来源: Using UTCTime with Hamlet