引入参数后编译 yesod 路由时遇到问题
Having trouble compiling yesod route after introducing a parameter
我是运行修改的例子
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
我假设只需要做一个小的修改。不过我对whamlet/hamlet的理解不是太好。所以我发布这个以防这是一个微不足道的问题。我完全明白我需要做更多的工作,我只是无法用谷歌搜索我的问题。所以请多多包涵。
修改路由后忘记将新添加的参数传递给 @{EntityR}
插值,如下所示:@{EntityR param}
.
我是运行修改的例子 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
我假设只需要做一个小的修改。不过我对whamlet/hamlet的理解不是太好。所以我发布这个以防这是一个微不足道的问题。我完全明白我需要做更多的工作,我只是无法用谷歌搜索我的问题。所以请多多包涵。
修改路由后忘记将新添加的参数传递给 @{EntityR}
插值,如下所示:@{EntityR param}
.