2016-11-24 1 views
0

J'ai essayé ce qui suit:Avec yesod, comment peut-on envoyer defaultLayout avec un code d'état HTTP personnalisé?

sendResponseStatus status403 $ (defaultLayout [whamlet|Foo|] :: Handler Html) 

Ce qui me donne cette erreur de type:

<interactive>:1:1: Warning: 
    Could not deduce (ToTypedContent (Handler Html)) 
     arising from a use of ‘sendResponseStatus’ 
    from the context (MonadHandler m) 
     bound by the inferred type of it :: MonadHandler m => m a 
     at <interactive>:1:1 
    In the expression: sendResponseStatus status403 
    In the expression: 
     sendResponseStatus status403 
     $ (defaultLayout 
      ((asWidgetT . toWidget) 
       ((blaze-markup-0.7.0.3:Text.Blaze.Internal.preEscapedText 
       . Data.Text.pack) 
       "Foo")) :: 
      Handler Html) 

Répondre

2

Il se avère que sendResponseStatus ne s'y attend pas Handler Html, mais Html plaine fonctionne à la place:

html <- defaultLayout [whamlet|Foo|] 
sendResponseStatus status403 html 

Qui compile et s'exécute comme prévu pour moi.

Il peut également judicieux de résumer cette logique en tant que tel:

sendResponseStatusHandler :: (ToTypedContent c, MonadHandler m) => Status -> m c -> m b 
sendResponseStatusHandler status handler = do 
    response <- handler 
    sendResponseStatus status response 

Depuis pouvoir passer dans un Handler me semble un peu plus puissant.