2

ユーザーが認証されているかどうかをテストし、状態に応じて「ログイン」または「ログアウト」リンクを表示したいと考えています。

これまでのところ、

$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'
4

1 に答える 1

6

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ユーザーがログインしているかどうかを示すために a を使用し、$if代わりにステートメントを使用することもできます。そのためにモジュールのisJust関数を使用したい場合があります。Data.Maybe

于 2012-07-29T18:23:15.977 に答える