Enlace a un archivo estático desde Hamlet
Pregunta
Actualmente estoy experimentando con Yesod siguiendo el Tutorial sobre el yesod wiki.
Primero creé una aplicación YESOD usando yesod init
, y creó un manejador de raíz que representa un archivo de widget llamado homepage
:
getRootR = do
mu <- maybeAuth
defaultLayout $ do
h2id <- lift newIdent
setTitle "Home"
addWidget $(widgetFile "homepage")
Tengo un archivo de imagen en la llamada del directorio estático static/img/logo.png
Después de tocar Settings/staticFiles.hs
, Logré vincular con éxito este archivo desde default-layout.hamlet
a través de
<img src=@{StaticR img_logo_png}
El problema ocurre ahora que quiero incluir este archivo estático en mi homepage
widget, usando exactamente la misma línea de código. El siguiente error ocurre en la compilación:
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"))
Entonces mi pregunta es: ¿cómo vinculo los recursos estáticos en widgets definidos con widgetFile
, ¿y por qué se comporta de manera diferente en la plantilla de diseño predeterminada?
Solución
Debe agregar una importación a Handler/Root.hs:
import Settings.StaticFiles
Si un archivo Hamlet lo requiere, cualquier archivo handler.hs que llame a ese archivo de aldea deberá importarlo primero. La razón por la cual predeterminando-sayout.hamlet no requiere ningún cambio es porque se llama en algún lugar de yo creo que la aplicación.hs tiene importaciones para casi todo, incluidas las cosas estáticas.