3

我正在 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 是错误的函数,但我找不到正确的函数。有谁知道我错过了什么?我应该如何将路由功能传递到我的 hamlet 代码中?

4

3 回答 3

4

为了让下一个搜索它的人更容易......

有两个问题。第一个答案指出了一个;hamlet 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
于 2012-04-10T01:27:12.073 回答
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

(注意附加$)。

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

于 2012-04-10T00:15:21.897 回答
1

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

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

于 2014-03-07T08:07:30.280 回答