代码之家  ›  专栏  ›  技术社区  ›  Markus Barthlen

引入参数后编译yesod路由时遇到问题

  •  1
  • Markus Barthlen  · 技术社区  · 9 年前

    我正在运行一个修改过的示例 http://www.yesodweb.com/book/blog-example-advanced

    之前未使用DBEntitySchemaId类型的参数id。 自从介绍它以来,我得到了

    Handler/Entity.hs:146:34:
        Couldn't match type ‘DBEntitySchemaId -> Route App’
                      with ‘Route (HandlerSite (WidgetT App IO))’
        Expected type: WidgetT
                        App IO ((DBEntitySchemaId -> Route App) -> [(Text, Text)] -> Text)
         Actual type: WidgetT
                        App
                        IO
                        (Route (HandlerSite (WidgetT App IO)) -> [(Text, Text)] -> Text)
       In the first argument of ‘(>>=)’, namely ‘getUrlRenderParams’
       In a stmt of a 'do' block:
         (getUrlRenderParams
          >>=
            (\ urender_akdM
               -> (asWidgetT GHC.Base.. toWidget)
                    (toHtml (\ u_akdN -> urender_akdM u_akdN [] EntityR))))
    

    它指的是使用defaultLayout的行。 相关代码为:

    getEntityR :: DBEntitySchemaId -> Handler Html
    getEntityR id = do
      oldEntities <- runDB $ selectList [DBEntityDbentitySchemaId ==. id] []
      fields <- runDB $ selectList [DBFieldDbentitySchemaId ==. id, DBFieldFieldTypeId ==. (toSqlKey 1)] []
      mauthId <- maybeAuthId
      ((res, widget), enctype) <- runFormPost (form fields)
      case (mauthId,res) of
        (Just userId, FormSuccess (attributeValues)) -> do
          setMessageI $ MsgSubmittedKarma
          let entity = DBEntity "Test" id
          entId <- runDB $ insert entity
          let fieldsNVals = zip fields attributeValues
          let einfuegen field attributeValue = case (field, attributeValue) of
                                          ((Entity fldId _), (FormSuccess val)) -> do
                                             a <- runDB $ insert (Attribute {attributeEntityId = entId, attributeDbfieldId = fldId, attributeStringValue =  val})
                                             return (Just a)
                                          _ -> return Nothing
          _ <- forM fieldsNVals (\(field, attributeValue) -> einfuegen field attributeValue)
    
          redirect $ (EntityR id)
        _ -> do        
          --render <- getUrlRenderParams
          --return $ renderHtml $ [hamlet|
          defaultLayout [whamlet|
              $if null oldEntities
                  <p>There are no entities
              $else
                  <ul>
                      $forall Entity entityId entity  <- oldEntities
                          <li>
                              <p>#{dBEntityName entity}
              $if mauthId == Nothing
                  <form method=post action=@{EntityR} enctype=#{enctype}>
                      <input type=submit value=_{MsgPleaseLogin}>
              $else
                  <form method=post action=@{EntityR} enctype=#{enctype}>
                      ^{widget}
                      <input type=submit>
          |]
    

    我已经试过把whamlet改成hamlet 从这里添加一些代码行(注释掉)

    Trying to send an email in yesod using hamlet

    和 改变

    [whamlet| 
    

    [whamlet|@{getEntityR}/#{id}|
    

    [whamlet||@?{urlParams id}|
    

    这其中的一些变化

    Render url with query parameters https://groups.google.com/forum/#!topic/yesodweb/q1gtkOgM32I

    我想只有一个小的修改要做。然而,我对霍姆莱特/哈姆雷特的理解并不太好。因此,我发布这篇文章,以防这是一个微不足道的问题。我完全明白我需要投入更多的工作,我只是在搜索我的问题时遇到了麻烦。所以请容忍我。

    1 回复  |  直到 8 年前
        1
  •  2
  •   arrowd    9 年前

    修改路线后,您忘记将新添加的参数传递到 @{EntityR} 插值,类似于: @{EntityR param} .