在Handler中提取数据库字段值

时间:2013-07-26 21:40:20

标签: haskell yesod

我想提取一个数据库字段(Text)并将其作为参数传递给Handler中的另一个函数。但是,我遇到了类型错误。完全成熟的例子可能会让人觉得有点做作,但应该说明我遇到的问题。

Person
  name Text

Car
  personId PersonId 
  name Text
  type Text

我想获得一个Car实体,然后找到相应的Person。得到他的名字,然后将其作为参数传递。类似的东西:

data MyD = MyD { input1 :: Int} 

entryForm :: Text -> Form MyD  -- Update: Removed the incorrect extra parameter
entryForm n1 = renderDivs $ MyD
  <$> areq intField n1 Nothing

我的获取处理程序如下:

getInputR :: CarId -> Handler Html
getInputR carId = do  
  car <- runDB $ get404 carId
  pid <- carPersonId car
  name <- getPName pid
  (widget, enctype) <- generateFormPost $ entryForm name
  defaultLayout $ do
     $(widgetFile "my_template")
  where
     getPName pid = do
         person <- runDB $ get404 pid
         personName person

我收到错误说:

Couldn't match expected type `HandlerT App IO t0'
       with actual type `KeyBackend
                      persistent-1.2.1:Database.Persist.Sql.Types.SqlBackend Person'
In the return type of a call of `carPersonId'
In a stmt of a 'do' block: pid <- carPersonId car

我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

尝试更改

pid <- carPersonId car
name <- getPName pid

name <- getPName $ carPersonId car

runDB调用返回的值不在处理程序monad中,因此您无需使用箭头语法来访问它。

对于第二个错误,问题类似:getPName函数的返回类型位于Handler monad中,因为它使用runDB,因此您需要使用return来设置值进入monad:

getPName pid = do
     person <- runDB $ get404 pid
     return $ personName person