链接到哈姆雷特的静态文件

Ant*_*ine 11 haskell yesod

我正在按照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,以及为什么它在默认布局模板中的行为方式不同?

Dav*_*aly 6

您需要向Handler/Root.hs添加导入:

import Settings.StaticFiles
Run Code Online (Sandbox Code Playgroud)

如果一个hamlet文件需要它,那么调用该hamlet文件的handler.hs文件将需要先导入它.default-layout.hamlet不需要任何更改的原因是因为它在某处被调用,我相信Application.hs几乎包含所有内容的导入,包括静态内容.