Как отображать алгебраический тип данных Html в Yesod

Я пытаюсь использовать CKEditor в своем приложении Yesod. Данные из CKEditor возвращаются на сервер через Textarea, затем я сохраняю их как Html в базе данных. Моя проблема в том, что я знаю, как отображать алгебраический тип данных Html, как только я извлекаю его из базы данных в обработчике. Я читал этот учебник, но он отображает HTML только как большая длинная строка, а не разметка.

Примечание. titleA и contextA — это переменные, которые я хочу отобразить в article-local-display. contextA — это Html алгебраический тип данных.

PS: нужно ли мне преобразовать Html в hamlet для рендеринга?

module Handler.Article where

import Import
import Data.Text (unpack)
import Data.Time (getCurrentTime)
import Data.String (fromString)

getArticleR :: Handler RepHtml
getArticleR = do
  defaultLayout $ do
      setTitle "Search For Article"
      $(widgetFile "header")
      $(widgetFile "article")

postArticleR :: Handler RepHtml
postArticleR = do
  redirect ArticleR

getArticleLocalR :: Handler RepHtml
getArticleLocalR = do
  articles <- runDB $ selectList ([] :: [Filter Article]) [Desc ArticleTime]
  defaultLayout $ do
      setTitle "Local Article"
      $(widgetFile "header")
      $(widgetFile "article-local")

getArticleLocalDisplayR :: ArticleId -> Handler RepHtml
getArticleLocalDisplayR articleId =  do 
  article <- runDB $ get404 articleId
  let titleA   = articleTitle article
      contextA = articleContext article
  defaultLayout $ do
      setTitle "Article"
      $(widgetFile "header")
      $(widgetFile "article-local-display")

getArticleLocalCreateR :: Handler RepHtml
getArticleLocalCreateR = do
  defaultLayout $ do
      setTitle "Create article"
      addScript $ StaticR ckeditor_ckeditor_js
      $(widgetFile "header")
      $(widgetFile "article-local-create")

postArticleLocalCreateR :: Handler RepHtml
postArticleLocalCreateR = do
  articleForm <- runInputPost $ ArticleForm <$> ireq textField "title" <*> ireq textareaField "editor1"
  now         <- liftIO getCurrentTime
  let titleA  =  title articleForm
      html    =  toHtml $ unTextarea $ context articleForm
  _           <- runDB $ insert $ Article titleA html now
  redirect ArticleLocalR

data ArticleForm = ArticleForm {
    title   :: Text,
    context :: Textarea
  }
  deriving Show

файл моделей:

Article
  title Text
  context Html
  time UTCTime
  deriving

статья-local-display.hamlet

<h1>#{titleA}
<article>#{contexA}

person HHC    schedule 01.06.2013    source источник


Ответы (1)


Поэтому я изменил контекст с Html на Text.

Article
  title Text
  context Text
  time UTCTime
  deriving

Затем добавил preEscapedText при использовании значения.

let contextA = preEscapedText $ articleContext article

Теперь он отображается правильно.

person HHC    schedule 03.06.2013