1

我有一个脚手架站点,我在 Home Handler 中使用这段代码。

{-# 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 中放入任何内容,我都会收到上述错误消息。如果我从 Yesod Book(Auth 部分)粘贴 whamlet 代码片段,而不是使用 $(widgetFile "homepage"),它可以正常工作。

如果我删除对 mayAuthId 的调用,问题也会消失。我猜这与调用 maybeAuthId 和使用 widgetFile 有关,但我不知道如何解决这个问题。任何帮助表示赞赏。

谢谢!

4

1 回答 1

2

maybeAuthId住在单Handler子里,里面defaultLayout是 a Widget,这就是为什么你有一个不匹配的原因。您可以执行以下操作之一:

  • 使用handlerToWidgetHandler动作转换为动作Widget
  • maybeAuthId呼叫移至之前defaultLayout
于 2013-07-14T08:09:37.883 回答