4

我对 Haskell 很陌生,你也可以猜到 Yesod 的新手。我想同时使用这两种方法来学习更多关于 Haskell 和 Web 开发的知识。

我有两个问题,由于我缺乏 Haskell 知识,这两个问题都可能是我犯的愚蠢错误:

(1) 我用 sqlite 创建了一个脚手架站点(我使用的是 Yesod 1.2)。我尝试在生成的 homepage.hamlet 文件中仅添加一行,但它给了我一个错误(顺便说一句,如果没有此添加,该站点可以正常工作)。我添加的行是:

<a href=@{AuthR LoginR}>Go to the login page

之后,我收到此错误消息:

Handler/Home.hs:34:11:
Not in scope: data constructor `LoginR'
In the result of the splice:
  $(widgetFile "homepage")
To see what the splice expanded to, use -ddump-splices
In a stmt of a 'do' block: $(widgetFile "homepage")
In the second argument of `($)', namely
  `do { aDomId <- newIdent;
        setTitle "Welcome To Yesod!";
        $(widgetFile "homepage") }'

有没有办法在其他处理程序/模板中公开 LoginR?

(2) 我最终想自定义登录页面的外观,所以我尝试按照此处的说明进行操作(也认为这可以解决上述问题,因为我在范围内声明了自己的处理程序):http ://hackological.com/博客/使用-twitter-to-authenticate-in-yesod/。基本上我修改了Foundation.hs的authRoute语句如下

authRoute _ = Just LoginPanelR

然后添加路线:

/login LoginPanelR GET

并在 Home.hs 中添加了处理程序

getLoginPanelR :: Handler RepHtml
getLoginPanelR = defaultLayout $(widgetFile "login")

我还使用链接中提供的内容创建了相应的 login.hamlet 文件。然后我收到以下错误:

Foundation.hs:100:32:
Couldn't match type `App' with `Auth'
Expected type: Route Auth
  Actual type: Route App
In the first argument of `AuthR', namely `LoginPanelR'
In the second argument of `($)', namely `AuthR LoginPanelR'
In the expression: Just $ AuthR LoginPanelR

你能告诉我我做错了什么吗?

谢谢!

4

1 回答 1

5

对于 (1),只需导入 Yesod.Auth。对于 (2):看起来,在您的 Hamlet 模板中,您正在使用AuthR LoginPanelR. 但是,LoginPanelR不是auth 子站点的一部分,因此应该省略 AuthR。

于 2013-06-12T10:20:52.207 回答