Как установить и получить несколько сообщений в обработчике, чтобы новые сообщения не перезаписывали ранее установленные?

Иногда веб-сайту/приложению необходимо отображать несколько сообщений пользователю после запроса. К сожалению, средства сообщений Yesod (если я хорошо понимаю документы), по-видимому, ограничены одно сообщение на запрос, при этом каждое новое сообщение перезаписывает предыдущее. Я думал, что могу использовать монаду записи внутри обработчика, чтобы обойти это, отображая список сообщений в HTML, прежде чем сохранять его с помощью 'setMessage', но, поскольку я довольно новичок в Haskell, я понятия не имею, как интегрировать дополнительный монада в сигнатуру типа обработчика (на самом деле, я даже не уверен, осуществимо это или нет). Итак, я хотел бы знать, каков рекомендуемый подход для нескольких сеансовых сообщений в Yesod? Спасибо.


person mesr    schedule 27.10.2013    source источник


Ответы (1)


Вы правильно прочитали книгу, у вас может быть только одно сообщение. Но вы можете отобразить любой HTML в этом сообщении. Вы можете использовать blaze-html для создания сообщения с любым HTML, который вы хотите.

Этот фрагмент делает именно это:

import Text.Blaze.Html5

-- Create a message.
message :: Html
message = do
    p "Welcome to my site"
    p "Your account was created successfully"       

-- Use the message in your handler.
getHomeR :: Handler Html
getHomeR = defaultLayout $ do
    setTitle "Yesod Web Service Homepage"    
    setMessage $ message
    $(widgetFile "home")

Для пользователя вашей домашней страницы это будет похоже на то, что у вас есть два сообщения. Чтобы узнать больше о blaze-html, посмотрите здесь.

person Rodrigo Taboada    schedule 28.10.2013
comment
Спасибо за быстрый ответ @RodrigoTaboada, но я уже понял это. Что меня все еще озадачивает (и мой вопрос не был ясен в этом вопросе), так это то, как установить несколько сообщений сеанса в разных местах кода для данного запроса (например, установить сообщение в getHomeR, затем установить другое внутри defaultLayout и т. д. ). - person mesr; 30.10.2013