我正在按照Yesod Wiki上的教程试验Yesod.
首先,我创建了一个yesod应用程序yesod init,并创建了一个Root处理程序,用于呈现一个名为的widget文件homepage:
getRootR = do
mu <- maybeAuth
defaultLayout $ do
h2id <- lift newIdent
setTitle "Home"
addWidget $(widgetFile "homepage")
Run Code Online (Sandbox Code Playgroud)
我在静态目录调用中有一个图像文件 static/img/logo.png
触摸后Settings/staticFiles.hs,我成功设法从default-layout.hamletvia 链接此文件
<img src=@{StaticR img_logo_png}
Run Code Online (Sandbox Code Playgroud)
现在出现的问题是我想在我的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"))
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:如何链接定义的小部件中的静态资源widgetFile,以及为什么它在默认布局模板中的行为方式不同?
您需要向Handler/Root.hs添加导入:
import Settings.StaticFiles
Run Code Online (Sandbox Code Playgroud)
如果一个hamlet文件需要它,那么调用该hamlet文件的handler.hs文件将需要先导入它.default-layout.hamlet不需要任何更改的原因是因为它在某处被调用,我相信Application.hs几乎包含所有内容的导入,包括静态内容.