尝试使用hamlet在yesod中发送电子邮件

时间:2012-04-09 22:03:10

标签: yesod hamlet

我正在Yesod建立一个调查网站(0.10)并且在这些类型中迷失了方向。 这是我想要做的简化版本。

invitation url = do
   render <- getUrlRender
   return $ renderHtml [hamlet|
<p>Dear foo, please take our 
   <a href=@{ShowSurveyR url}>survey.
|] render

另一个函数是调用它来希望获得可以从Network.Mail.Mime传递给simpleMail的东西。上面的函数给出了一个类型错误:

Handler/Root.hs:404:13:
    The function `renderHtml' is applied to two arguments,
    but its type `Html -> LT.Text' has only one

这很令人困惑,因为模板教程似乎以这种方式做事。 但是,如果我修改代码,就像这样......

invitation url = do
   return $ renderHtml [hamlet|
<p>Dear foo, please take our
   <a href=@{ShowSurveyR url}>survey.
|]

我收到此类错误。

Handler/Root.hs:403:24:
    The lambda expression `\ _render[a4TO] -> ...' has one argument,
    but its type `Html' has none
    In the first argument of `renderHtml', namely

我认为renderHtml使用的函数不对,但我找不到正确的函数。有谁知道我错过了什么?我该如何将路由功能传递给我的哈姆雷特代码?

3 个答案:

答案 0 :(得分:4)

为了让下一个寻找它的人更容易...

有两个问题。第一个答案指出了一个;小村庄quasiquoter本身就是一个功能。另一个问题是我需要使用函数getUrlRenderParams,而不是getUrlRender。 最终的代码是

invitation :: Text -> Handler LT.Text
invitation url = do
   render <- getUrlRenderParams
   return $ renderHtml $ [hamlet|
<p>Dear foo, please take our
   <a href=@{ShowSurveyR url}>survey.
|] render

答案 1 :(得分:3)

quasiquote([hamlet|...|])返回一个函数,其参数一个函数。您必须首先应用该quasiquote值,并将结果传递给renderHtml:

[编辑:正如@MattoxBeckman发现的那样,另一个问题是需要使用getUrlRenderParams而不是gutUrlRender。]

invitation url = do
  render <- getUrlRenderParams
  return $ renderHtml $ [hamlet|
<p>Dear foo, please take our 
<a href=@{ShowSurveyR url}>survey.
|] render

(注意额外的$)。

P.S。 renderHtml的类型为Html -> Text,而quasiquote的结果[hamlet|..|]的类型为Render url -> Html。您看到的第一条错误消息指出您尝试将两个参数传递给renderHtml,而第二条错误消息指出您没有将任何参数传递给quasiquote值。

答案 2 :(得分:1)

只需替换shamlet而不是hamlet;它根本不需要render参数。

(正如joelteon在#yesod指出的那样。)

相关问题