Ссылка на статический файл из Hamlet
Вопрос
В настоящее время я экспериментирую с Yesod, следуя учебное пособие по Yesod Wiki.
Сначала я создал приложение yesod, используя yesod init
, и создал корневой обработчик , который отображает файл виджета с именем homepage
:
getRootR = do
mu <- maybeAuth
defaultLayout $ do
h2id <- lift newIdent
setTitle "Home"
addWidget $(widgetFile "homepage")
У меня есть файл изображения в статическом каталоге call 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
, и почему он ведет себя по-другому в шаблоне макета по умолчанию?
Решение
Вам нужно добавить импорт в Handler/Root.hs:
import Settings.StaticFiles
Если это требуется для файла hamlet, то какой бы файл handler.hs ни вызывал этот файл hamlet, сначала потребуется импортировать его.Причина, по которой default-layout.hamlet не требует никаких изменений, заключается в том, что он вызывается где-то в, я полагаю, приложении.hs, в котором есть импорт практически для всего, включая статические данные.