2012-07-29 4 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

쿨러. 나는 천천히 모나드와 haskell을 일반적으로 사용하고있다. –

관련 문제