1

スキャフォールディングされたサイトがあり、ホーム ハンドラーでこのコード スニペットを使用しています。

{-# LANGUAGE TupleSections, OverloadedStrings #-}
module Handler.Home where

import Import
import Yesod.Auth

getHomeR :: Handler RepHtml   
getHomeR = do
  defaultLayout $ do
    maid <- maybeAuthId
    setTitle "Welcome!"
    $(widgetFile "homepage")

maid 私は私のhomepage.hamletファイルにアクセスしたいと思います。ただし、次のエラーが表示されます。

Handler/Home.hs:10:17:
    Couldn't match expected type `WidgetT site0 IO t0' 
                with actual type `HandlerT master0 IO (Maybe (AuthId master0))'
    In a stmt of a 'do' block: maid <- maybeAuthId
    In the second argument of `($)', namely
      `do { maid <- maybeAuthId;
            setTitle "Welcome!";
            $(widgetFile "homepage") }'
    In a stmt of a 'do' block:
      defaultLayout
      $ do { maid <- maybeAuthId;
             setTitle "Welcome!";
             $(widgetFile "homepage") }

Homepage.hamlet 内にコンテンツを配置したかどうかに関係なく、上記のエラー メッセージが表示されます。を使用する代わりに $(widgetFile "homepage")、Yesod Book (Auth セクション) から whamlet コード スニペットを貼り付けると、正常に動作します。

MaybeAuthId への呼び出しを削除すると、問題も解消されます。MaybeAuthId の呼び出しと widgetFile の使用に関係していると推測していますが、問題を解決する方法がわかりません。どんな助けでも感謝します。

ありがとう!

4

1 に答える 1

2

maybeAuthIdHandlerはモナドに住んでいて、 の内部はdefaultLayoutですWidget。そのため、不一致があります。次のいずれかを行うことができます。

  • handlerToWidgetを使用Handlerしてアクションをアクションに変換しますWidget
  • maybeAuthId通話を前に移動defaultLayout
于 2013-07-14T08:09:37.883 に答える