Ссылка на статический файл из Hamlet

В настоящее время я экспериментирую с Yesod, следуя учебному посоку в Yesod Wiki.

Сначала я создал приложение yesod с помощью yesod init и создал обработчик Root, который отображает файл виджетов с именем homepage:

getRootR = do
mu <- maybeAuth
defaultLayout $ do
    h2id <- lift newIdent
    setTitle "Home"
    addWidget $(widgetFile "homepage")

У меня есть файл изображения в вызове статического каталога static/img/logo.png

После касания Settings/staticFiles.hs мне удалось связать этот файл с default-layout.hamlet через

<img [email protected]{StaticR img_logo_png}

Проблема возникает теперь, когда я хочу включить этот статический файл в мой виджет homepage, используя точно такую ​​же строку кода. При компиляции возникает следующая ошибка:

Handler/Root.hs:19:21:
    Not in scope: `img_logo_png'
    In the result of the splice:
      $(widgetFile "homepage")
    To see what the splice expanded to, use -ddump-splices
    In the first argument of `addWidget', namely
      `$(widgetFile "homepage")'
    In the expression: addWidget ($(widgetFile "homepage"))

Итак, мой вопрос: как связать статические ресурсы в виджетах, определенных с помощью widgetFile, и почему он ведет себя по-другому в шаблоне макета по умолчанию?

Ответ 1

Вам нужно добавить импорт в Handler/Root.hs:

import Settings.StaticFiles

Если для файла дереву требуется его, то какой файл handler.hs, который вызывает этот файл hamlet, должен будет сначала импортировать его. Причина, по которой default-layout.hamlet не требует каких-либо изменений, заключается в том, что он называется где-то в ядре Application.hs, у которого есть импорт для почти всего, включая статические вещи.