我正在按照tutorial on the Yesod Wiki。
尝试使用Yesod首先,我使用yesod init
创建了一个yesod应用程序,并创建了一个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
定义的小部件中的静态资源,以及为什么它在默认布局模板中的行为方式不同?
答案 0 :(得分:6)
您需要向Handler / Root.hs添加导入:
import Settings.StaticFiles
如果一个hamlet文件需要它,那么调用该hamlet文件的handler.hs文件将需要先导入它。 default-layout.hamlet不需要任何更改的原因是因为它在某处被称为Application.hs,它几乎包含所有内容的导入,包括静态内容。