我想测试用户是否通过了身份验证,并根据状态显示“登录”或“注销”链接。
到目前为止,我已经
$maybe muid <- maybeAuthId
<a href=@{AuthR LogoutR} >Logout
$nothing
<a href=@{AuthR LoginR} >Login但我得到一个错误:
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'发布于 2012-07-30 02:23:16
maybeAuthId是执行数据库和会话相关操作的单点操作。您不能在Hamlet模板的定义中包含一元操作。想象一下,如果您编写以下代码(类似的一元操作),会发生什么情况:
$maybe a <- liftIO (putStrLn "Hello World") >> return (Just "Hi")
<p>Just #{a}
$nothing
<p>Nothing应该多久执行一次该操作;每次呈现模板时?当它装弹的时候?如果它做的不仅仅是将"Hello World“打印到终端上,那么它可能会变得非常混乱,而且即使这样它也不是很安全--您希望您的模板文件能够打印到终端上,发射核武器或窃取您的信用卡信息吗?
这就是为什么在所有莎士比亚的模板中只允许纯值的原因。您需要改为执行以下操作:
getMyHandlerR :: Handler RepHtml
getMyHandlerR = do
muid <- maybeAuthId
$(widgetFile "foo")(foo.hamlet:)
$maybe uid <- muid
<p>Foo
$nothing
<p>Bar如您所见,maybeAuthId函数将在模板外部执行,并且结果将在模板内匹配。这样,您可以确保在您可以确定的特定时间点检查您的会话/数据库,并且您的模板不会因为您的设计师没有得到足够的报酬而对您进行报复而注入病毒。
顺便说一句,您可能希望使用Bool来指示用户是否已登录,并改为使用$if语句。为此,您可能需要使用Data.Maybe模块中的isJust函数。
https://stackoverflow.com/questions/11711302
复制相似问题