首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试用户是否在Hamlet模板中登录

测试用户是否在Hamlet模板中登录
EN

Stack Overflow用户
提问于 2012-07-30 01:22:15
回答 1查看 211关注 0票数 2

我想测试用户是否通过了身份验证,并根据状态显示“登录”或“注销”链接。

到目前为止,我已经

代码语言:javascript
复制
$maybe muid <- maybeAuthId
    <a href=@{AuthR LogoutR} >Logout
$nothing
    <a href=@{AuthR LoginR} >Login

但我得到一个错误:

代码语言:javascript
复制
Couldn't match expected type `Maybe v0'
            with actual type `GHandler s0 m0 (Maybe (AuthId m0))'
In the first argument of `Text.Hamlet.maybeH', namely `maybeAuthId'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-30 02:23:16

maybeAuthId是执行数据库和会话相关操作的单点操作。您不能在Hamlet模板的定义中包含一元操作。想象一下,如果您编写以下代码(类似的一元操作),会发生什么情况:

代码语言:javascript
复制
$maybe a <- liftIO (putStrLn "Hello World") >> return (Just "Hi")
    <p>Just #{a}
$nothing
    <p>Nothing

应该多久执行一次该操作;每次呈现模板时?当它装弹的时候?如果它做的不仅仅是将"Hello World“打印到终端上,那么它可能会变得非常混乱,而且即使这样它也不是很安全--您希望您的模板文件能够打印到终端上,发射核武器或窃取您的信用卡信息吗?

这就是为什么在所有莎士比亚的模板中只允许纯值的原因。您需要改为执行以下操作:

代码语言:javascript
复制
getMyHandlerR :: Handler RepHtml
getMyHandlerR = do
  muid <- maybeAuthId
  $(widgetFile "foo")

(foo.hamlet:)

代码语言:javascript
复制
$maybe uid <- muid
  <p>Foo
$nothing
  <p>Bar

如您所见,maybeAuthId函数将在模板外部执行,并且结果将在模板内匹配。这样,您可以确保在您可以确定的特定时间点检查您的会话/数据库,并且您的模板不会因为您的设计师没有得到足够的报酬而对您进行报复而注入病毒。

顺便说一句,您可能希望使用Bool来指示用户是否已登录,并改为使用$if语句。为此,您可能需要使用Data.Maybe模块中的isJust函数。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11711302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档