2011-10-19 19 views
11

Actualmente estoy experimentando con Yesod siguiendo el tutorial on the Yesod Wiki.Enlace a un archivo estático de Hamlet

Primero creó una aplicación yesod usando yesod init, y creó un controlador de raíz que hace que un archivo widget de llamada homepage:

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

Tengo un archivo de imagen en la llamada directorio estática static/img/logo.png

Después de tocar Settings/staticFiles.hs, he conseguido con éxito para enlazar este archivo desde default-layout.hamlet través

<img [email protected]{StaticR img_logo_png} 

El problema se produce ahora que quiero incluir este archivo estático en mi widget homepage, usando exactamente la misma línea de código. El siguiente error se produce durante 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")) 

Así que mi pregunta es: ¿Cómo se enlazan los recursos estáticos en los widgets definidos con widgetFile, y por qué se comportan de manera diferente en la plantilla de diseño por defecto?

Respuesta

6

es necesario agregar una importación de Manipulador/Root.hs:

import Settings.StaticFiles 

Si un archivo aldea requiere entonces que sea handler.hs archivo que llama a ese archivo aldea tendrá que importar primero. La razón por la que default-layout.hamlet no requiere ningún cambio es porque se llama en alguna parte de I believe Application.hs que tiene importaciones para casi todo, incluso cosas estáticas.

Cuestiones relacionadas