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

时间:2011-10-19 16:45:45

标签: haskell yesod

我正在按照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定义的小部件中的静态资源,以及为什么它在默认布局模板中的行为方式不同?

1 个答案:

答案 0 :(得分:6)

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

import Settings.StaticFiles

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