Почему я не могу определить произвольное поле в 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