3 Stimmen

Nicht möglich, typsichere Routen in Yesod-Teilseitenwidget zu verwenden

Ich arbeite an einem CMS, das auf Yesod für mein Abschlusspraktikum basiert. Derzeit verwenden wir ein Subsite (Core), um den Admin-Bereich darzustellen. Dieser Core sollte zwischen Projekten wiederverwendbar sein, sodass er vom Hauptstandort getrennt ist und über ein eigenes Repository verfügt. Es sollte möglich sein, andere Subsites in den Core zu integrieren. Diese anderen Subsites sollten alle das gleiche (Admin-) Layout verwenden können.

Die von uns verwendeten Repositories sind:
CMS-Kern: https://github.com/lambdacms/lambdacms-core/tree/extensions
CMS-Media-Erweiterung: https://github.com/lambdacms/lambdacms-media
Demo Yesod Master: https://github.com/lambdacms/ponycms/tree/media

Beachten Sie, dass diese URLs auf bestimmte Branches verweisen. Das sind die Branches, die ich derzeit verwende.

Anfangs habe ich die Funktion lambdaCoreLayout (die in Foundation.hs gefunden wurde) verwendet, um das richtige Layout für alle Handler innerhalb des Core selbst bereitzustellen. Aber ich konnte diese Funktion nicht in anderen Subsites verwenden. Anstatt zu wiederholen, was bereits funktionierte, habe ich die Funktion tryoutLayout (die in derselben Datei gefunden wurde) hinzugefügt, die für alle Subsites funktioniert und defaultLayoutSub (die mit Yesod geliefert wird) ähnelt. Es erlaubt mir jedoch nicht, getRouteToParent in einem der Handler zu verwenden, um sichere Typenrouten zu den Widgets hinzuzufügen.

Nehmen Sie zum Beispiel diesen Ausschnitt:

getAdminHomeR :: CoreHandler Html
getAdminHomeR = do
  tp <- getRouteToParent
  tryoutLayout [whamlet|@{tp AdminHomeR}|]

Dies gibt mir folgenden Fehler:

Konnte (master ~ Core) nicht ableiten
aus dem Kontext (LambdaCmsAdmin master)
  begrenzt durch die Typsignatur für
             getAdminHomeR :: LambdaCmsAdmin master =>
                              HandlerT Core (HandlerT master IO) Html
  bei LambdaCms/Core/Handler/Home.hs:17:18-33
  ‘master’ ist eine starre Typvariable, begrenzt durch
           die Typsignatur für
             getAdminHomeR :: LambdaCmsAdmin master =>
                              HandlerT Core (HandlerT master IO) Html
           bei 
Erwarteter Typ: WidgetT
                 Core
                 IO
                 (yesod-core-1.4.2:Yesod.Routes.Class.Route master
                  -> [(Text, Text)] -> Text)
  Tatsächlicher Typ: WidgetT
                 Core
                 IO
                 (yesod-core-1.4.2:Yesod.Routes.Class.Route
                    (HandlerSite (WidgetT Core IO))
                  -> [(Text, Text)] -> Text)
Relevante Bindungen enthalten
  tp :: yesod-core-1.4.2:Yesod.Routes.Class.Route Core
        -> yesod-core-1.4.2:Yesod.Routes.Class.Route master
    (begrenzt bei LambdaCms/Core/Handler/Home.hs:20:3)
  getAdminHomeR :: HandlerT Core (HandlerT master IO) Html
    (begrenzt bei LambdaCms/Core/Handler/Home.hs:19:1)
Im ersten Argument von ‘(>>=)’, nämlich ‘getUrlRenderParams’
Im ersten Argument von ‘tryoutLayout’, nämlich
  ‘((getUrlRenderParams
     >>=
       (\ urender_agTZ
          -> (asWidgetT . toWidget)
               (toHtml (\ u_agU0 -> urender_agTZ u_agU0 [] (tp AdminHomeR))))))’

Wenn ich richtig liege, deutet dieser Fehler darauf hin, dass getRouteToParent versucht, eine Funktion zurückzugeben, die versucht, eine Route Core anstatt einer Route master zu generieren. Ich habe versucht, tp <- getRouteToParent an verschiedenen Stellen einzufügen, aber es ist mir nicht gelungen, dass es funktioniert.

Mein eigenes Wissen über Haskell und Yesod ist begrenzt, und ich habe keine Lösung oder Hinweise in die richtige Richtung finden können. Fehlt mir etwas oder sollte dies auf eine andere Weise angegangen werden?

2voto

Michael Snoyman Punkte 31032

Sie möchten, dass Ihre tryoutLayout-Funktion einen Wert vom Typ WidgetT master IO () annimmt, nicht WidgetT Core IO (), um Ihnen das Einbetten von Master-Seitenrouten zu ermöglichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X