Несоответствие типов полей в Yesod custom settings.yml
Я пытаюсь создать новое поле в моем файле settings.yml для расположения моего статического файла (чтобы я мог перейти с локального подкаталога в разработке на CDN в производстве), но мне кажется, что я не могу получить базовый "привет" Мир "собирается. Вот мой Settings.hs:
data Extra = Extra
{ extraCopyright :: Text
, extraAnalytics :: Maybe Text -- ^ Google Analytics
, extraStatic :: Text
} deriving Show
parseExtra :: DefaultEnv -> Object -> Parser Extra
parseExtra _ o = Extra
<$> o .: "copyright"
<*> o .:? "analytics"
<*> o .: "static"
А вот и соответствующая часть settings.yml:
Default: &defaults
host: "*4" # any IPv4 host
port: 3000
approot: "http://localhost:3000"
copyright: Insert copyright statement here
#analytics: UA-YOURCODE
static: "/static"
И, наконец, часть, которая выдает ошибку. Я действительно не знал, как я должен был включить его значение в запрос, поэтому я просто добавил код, который будет выполняться при каждом запросе:
getHomeR :: Handler Html
getHomeR = do
(formWidget, formEnctype) <- generateFormPost sampleForm
let submission = Nothing :: Maybe (FileInfo, Text)
handlerName = "getHomeR" :: Text
test = fmap extraStatic getExtra
defaultLayout $ do
aDomId <- newIdent
setTitle "Welcome To Yesod!"
$(widgetFile "homepage")
И у меня есть та же строка, добавленная на postHomeR, а также (test = fmap extraStatic getExtra). Моя деревня:
<p>#{test}
И, наконец, ошибка, выдаваемая на экран:
Handler/Home.hs:37:11:
No instance for (blaze-markup-0.5.1.5:Text.Blaze.ToMarkup
(HandlerT App IO Text))
arising from a use of `toHtml'
Possible fix:
add an instance declaration for
(blaze-markup-0.5.1.5:Text.Blaze.ToMarkup (HandlerT App IO Text))
In the first argument of `Yesod.Core.Widget.asWidgetT
. toWidget', namely
`toHtml test'
In a stmt of a 'do' block:
(Yesod.Core.Widget.asWidgetT . toWidget) (toHtml test)
In a stmt of a 'do' block:
do { (Yesod.Core.Widget.asWidgetT . toWidget)
((blaze-markup-0.5.1.5:Text.Blaze.Internal.preEscapedText
. Data.Text.pack)
"<h1>");
((Control.Monad.liftM (toHtml .) getMessageRender)
>>=
(\ urender_aaYh
-> (Yesod.Core.Widget.asWidgetT . toWidget)
(urender_aaYh MsgHello)));
(Yesod.Core.Widget.asWidgetT . toWidget)
((blaze-markup-0.5.1.5:Text.Blaze.Internal.preEscapedText
. Data.Text.pack)
"</h1>\
\<ol><li>Now that you have a working project you should use the <a href=\"http://www.yesodweb.com/book/\">Yesod book</a> to learn more. You can also use this scaffolded site to explore some basic concepts.</li><li> This page was generated by the ");
(Yesod.Core.Widget.asWidgetT . toWidget) (toHtml handlerName);
.... }
Build failure, pausing...
Есть ли способ, которым я могу разыграть это? Можно ли как-нибудь сделать так, чтобы переменная была назначена и загружена во время запуска приложения, но была доступна во всех запросах как постоянное значение? Любая помощь будет принята с благодарностью!
1 ответ
Проблема в:
let test = fmap extraStatic getExtra
getExtra
это Handler
действие, так что вы хотите это:
test <- fmap extraStatic getExtra