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は使用するのに間違った関数だと思いますが、正しい関数が何であるかがわかりません。誰かが私が欠けているものを知っていますか?ルーティング関数をハムレットコードに渡すにはどうすればよいですか?

4

3 に答える 3

4

次の人が探しに行くのを簡単にするために...

2 つの問題がありました。1つは最初の回答で指摘されました。hamlet quasiquoter 自体が関数を取ります。もう 1 つの問題は、getUrlRender ではなく、getUrlRenderParams 関数を使用する必要があることでした。最終的なコードは

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 が発見したように、別の問題は、gutUrlRender の代わりに getUrlRenderParams を使用する必要があることです。]

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

(追加に注意してください$)。

PS renderHtml の型は ですが、準引用符Html -> Textの結果の[hamlet|..|]型はRender url -> Htmlです。最初に表示されたエラー メッセージは、renderHtml に 2 つの引数を渡そうとしたことを示していますが、2 番目のエラー メッセージは、quasiquote 値に引数を渡さなかったことを示しています。

于 2012-04-10T00:15:21.897 に答える
1

;shamletの代わりに置き換えるだけです。引数hamletはまったく必要ありません。render

(#yesod で joelteon が私に指摘したように。)

于 2014-03-07T08:07:30.280 に答える