Почему я не могу определить произвольное поле в Hakyll?

При попытке определить поле "ссылки" на моей странице индекса, я сталкиваюсь с ошибкой, которая говорит: [ERROR] Missing field $links$ in context for item index.htmlхотя я создал links поле. (По крайней мере, я уверен, что у меня есть...)

-- site.hs
main = hakyll $ do

    match "index.html" $ do
        route idRoute
        compile $ do
            links <- loadAll "links/*"
            let indexCtx =
                    listField "links" linkCtx (return links) `mappend`
                    constField "title" "Home"                `mappend`
                    defaultContext

            getResourceBody
                >>= applyAsTemplate indexCtx
                >>= loadAndApplyTemplate "templates/default.html" indexCtx
                >>= relativizeUrls

    match "templates/*" $ compile templateBodyCompiler


linkCtx :: Context String
linkCtx =
    field "link" $ \item -> return (itemBody item)
    defaultContext

-- index.html
<h2>Links</h2>
$partial("templates/link-list.html")$

-- templates/link-list.html
<ul>
    $for(links)$
        $link$
    $endfor$
</ul>

-- links/behance.markdown
---
title: Behance
---

[Behance](https://www.behance.net/laylow)

1 ответ

Решение

При попытке вашего кода, я не получаю такой ошибки. Вместо этого я получаю ошибку типа от linkCtx. Это можно исправить следующим образом:

linkCtx =
    field "link" (\item -> return (itemBody item)) `mappend`
    defaultContext

Или, более идиотски, заменив лямбду на бессмысленную форму.

linkCtx =
    field "link" (return . itemBody) `mappend`
    defaultContext

Также, если вы хотите загрузить некоторые элементы, вы должны сначала сопоставить их, чтобы хакилл знал об их существовании.

    match "links/*" $ compile pandocCompiler

После внесения изменений, перечисленных выше, перестройте site.hs, используя: stack build и список ссылок будет отображаться в index.html

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