Проверить, вошел ли пользователь в шаблон Гамлета
Я хочу проверить, прошел ли пользователь аутентификацию, и показать ссылку "войти" или "выйти" в зависимости от состояния.
Пока у меня есть
$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
Модуль для этого.