【问题标题】:Having trouble compiling yesod route after introducing a parameter引入参数后编译 yesod 路由时遇到问题
【发布时间】:2016-02-13 16:57:08
【问题描述】:

我正在运行一个修改后的示例 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))))

指的是使用默认布局的行。 相关代码为:

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

我认为只需要进行一些小的修改。然而,我对 whamlet/hamlet 的理解并不太好。所以我发布这个以防万一这是一个微不足道的问题。我完全明白我需要做更多的工作,我只是在谷歌上搜索我的问题时遇到了麻烦。所以请多多包涵。

【问题讨论】:

  • 如果我猜对了,您需要向@{EntityR} 添加一些参数,如下所示:@{EntityR param}
  • 你完全正确,我看错了地方(因为行号指的是包含[whamlet|的行)。请发布答案,以便我可以将问题标记为已回答。非常感谢。

标签: haskell yesod hamlet


【解决方案1】:

修改路线后,您忘记将新添加的参数传递给@{EntityR}插值,如下所示:@{EntityR param}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多