2017-10-20 5 views
1

Ich baue eine einfache Anwendung mit Yesod und ich habe es schwer, externe Dateien zu bringen. Hier ist mein Code:hamletFile, luciusFile, juliusFile Variablen nicht im Bereich

{-# LANGUAGE OverloadedStrings  #-} 
{-# LANGUAGE QuasiQuotes   #-} 
{-# LANGUAGE TemplateHaskell  #-} 
{-# LANGUAGE TypeFamilies   #-} 
import   Yesod 

data GomokuServer = GomokuServer 

mkYesod "GomokuServer" [parseRoutes| 
/HomeR GET 
|] 

instance Yesod GomokuServer 

getHomeR :: Handler Html 
getHomeR = defaultLayout $ do 
     $(hamletFile "./src/templates/home.hamlet") 
     $(luciusFile "./src/templates/home.lucius") 

main :: IO() 
main = warp 3000 GomokuServer 

Es funktioniert großartig, wenn ich quasiquotes verwenden, oder wenn ich hamletFile mit whamletFile ersetzen, aber sonst wird es nicht kompilieren, weil es nicht hamletFile oder luciusFile finden. Ich benutze Jessod Version 1.4 und ich dachte, dass diese Methoden mit dem Core-Yesod-Paket importiert wurden. Sind sie nicht?

Antwort

2

Warum benutzen Sie nicht einfach whamletFile? Die meiste Zeit möchten Sie ein Widget.

Es scheint hamletFile wird nicht wieder exportiert.

λ import Yesod 
λ :t hamletFile 

<interactive>:1:1: error: 
    • Variable not in scope: hamletFile 
    • Perhaps you meant ‘whamletFile’ (imported from Yesod) 

Wenn Sie es wirklich brauchen, können Sie es von Text.Hamlet zu bringen.

FWIW die Yesod scaffolding definiert eine Funktion

widgetFile :: String -> Q Exp 
widgetFile = (if appReloadTemplates compileTimeAppSettings 
       then widgetFileReload 
       else widgetFileNoReload) 
       widgetFileSettings 

Und dann habe ich diese einfach überall verwenden wie $(Settings.widgetFile "homepage") die standardmäßig bringt im Weiler, lucius und Cassius Dateien für „Homepage“. Sie können mehr Informationen unter Overriding-widgetFile on the Yesod wiki sehen

+0

Kann ich 'hamletFile' verwenden, um externe' .lucius' Dateien zu importieren? Ich hatte den Eindruck, dass es nur mit '.hamlet' Dateien funktionieren würde. Ich habe mit Text.Hamlet importiert. –

+0

Sie können 'hamletFile' nicht zum Importieren von Lucius-Dateien verwenden, aber Sie können die' widgetFile'-Funktion verwenden, die alle 3 Dateien von damlet, lucius und cassius importiert. – Ben

+0

Aber 'widgetFile' ist nicht in der Core-yesod-Bibliothek enthalten, oder? Ich müsste yesod-scaffold zu meiner Abhängigkeitsliste hinzufügen, was wie ein Overkill aussieht, wenn man bedenkt, dass das die einzige Funktion ist, die ich verwenden werde. –

Verwandte Themen