2012-04-09 46 views
3

我在Yesod(0.10)建立一個調查網站,並在類型中迷路。 這是我正在嘗試做的簡化版本。試圖發送電子郵件在yesod使用hamlet

invitation url = do 
    render <- getUrlRender 
    return $ renderHtml [hamlet| 
<p>Dear foo, please take our 
    <a [email protected]{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 [email protected]{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

quasiquote([hamlet|...|])返回一個函數,其參數是也是函數。你必須首先申請的是quasiquote值,並且將結果傳遞renderHtml:

[編輯:作爲@MattoxBeckman發現,另一個問題是使用getUrlRenderParams代替gutUrlRender需要]

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

(注額外$)。

P.S. renderHtml的類型爲Html -> Text,而quasiquote的結果爲[hamlet|..|],其類型爲Render url -> Html。您看到的第一條錯誤消息指出您嘗試將兩個參數傳遞給renderHtml,而第二條錯誤消息指出您未將任何參數傳遞給quasiquote值。

+0

是的,我試過了太,並得到了不同類型的錯誤。但問題似乎是我需要使用getUrlRenderParams。一旦我這樣做了,代碼就起作用了。謝謝你的幫助! – MattoxBeckman 2012-04-10 01:24:22

+0

對,我知道。 ;)很高興你懂了! – chreekat 2012-04-10 17:08:05

4

爲了更方便了誰去爲它尋找下一個人......

有兩個問題。第一個答案指出了一個問題;哈姆雷特quasiquoter本身需要一個功能。另一個問題是我需要使用函數getUrlRenderParams,而不是getUrlRender。 最後的代碼是

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

只需更換shamlet,而不是hamlet;它根本不需要render參數。

(正如在#yesod指着我的joelteon。)