2012-07-29 70 views
2

我想測試用戶是否已通過身份驗證並顯示「登錄」或「註銷」鏈接,具體取決於狀態。測試用戶是否已登錄哈姆雷特模板

到目前爲止,我有

$maybe muid <- maybeAuthId 
    <a [email protected]{AuthR LogoutR} >Logout 
$nothing 
    <a [email protected]{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' 

回答

6

maybeAuthId是執行數據庫和會話相關的操作的單子行動。在哈姆雷特模板的定義中,你不能有一元行爲。想象一下,如果你寫這個(類似的一次性動作)會發生什麼:

$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功能。

+0

很酷的謝謝。一般來說,我慢慢獲得monad和haskell的竅門。 – 2012-08-02 16:01:32