Как в yesod (haskell) загрузить обычный файл в формате html (не гамлет) в качестве виджета?

Как загрузить обычный файл в формате html (не файл в формате hamlet) в качестве виджета? Другими словами, я ищу html-эквивалент:

toWidget $(whamletFile "test.hamlet")

person daj    schedule 26.05.2015    source источник


Ответы (1)


Для этого вы используете sendFile в своей функции-обработчике (см. его определение)

Первый аргумент — это тип Mime, а второй — путь к файлу.

Например, вы можете написать что-то вроде:

getMyFileR :: Handler ()
getMyFileR = sendFile "text/html" "myfile.html"

Вот еще один пример. Скажем, у меня есть следующая модель:

Resource
    filename    FilePath
    mimetype    ContentType

    deriving    Typeable

Обработчик может выглядеть так:

resourceDirectory :: FilePath
resourceDirectory = "resource"

getResourceGetR :: ResourceId -> Handler ()
getResourceGetR resourceId = do
    resource <- runDB $ get404 resourceId

    sendFile (resourceMimetype resource)
             (resourceDirectory </> unpack (resourceFilename resource))

Редактировать 2015-06-05

sendFile работает на низком уровне, а addScript или $(widgetFile …) работает на более высоком уровне.

$(widgetFile …) использует TemplateHaskell для преобразования ваших шаблонов Hamlet/Cassius/Lucius/Julius в фактический исходный код Haskell перед компиляцией вашего проекта. То же самое относится и к [hamlet|…|].

addScriptработает с Route, а sendFile работает с FilePath. Это означает, что addScript сможет обнаруживать отсутствующие файлы во время компиляции. sendFile обнаружит отсутствующие файлы во время выполнения.

Есть несколько инструментов для преобразования Html в Hamlet:

Эквивалент addScript для файлов Html не имеет смысла: addScript создаст тег script, сообщающий браузеру о загрузке внешнего ресурса. Это не относится к файлу HTML.

person zigazou    schedule 26.05.2015
comment
Я все еще новичок в этом, но разве синтаксис, который я использовал для неявной ссылки на файл, без явной настройки ресурса, не используется? Кажется, это работает для файлов hamlet. Несмотря на это, после настройки обработчика ресурсов у julius есть addScript, который можно вызвать для ресурса для загрузки именованного внешнего ресурса julius. Что эквивалентно addScript для простого html-ресурса? - person daj; 26.05.2015