Проверить, вошел ли пользователь в шаблон Гамлета

Я хочу проверить, прошел ли пользователь аутентификацию, и показать ссылку "войти" или "выйти" в зависимости от состояния.

Пока у меня есть

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

1 ответ

Решение

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 утверждение вместо. Вы можете использовать isJust функция от Data.Maybe Модуль для этого.

Другие вопросы по тегам