Ссылка на статический файл от Гамлета - PullRequest
11 голосов
/ 19 октября 2011

В настоящее время я экспериментирую с 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 src=@{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 Ответ

6 голосов
/ 20 октября 2011

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

import Settings.StaticFiles

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

...