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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top