【问题标题】:Extracting database field values inside a Handler在处理程序中提取数据库字段值
【发布时间】:2013-07-27 14:47:41
【问题描述】:

我想提取一个数据库字段(文本)并将其作为参数从处理程序传递给另一个函数。但是,我遇到了类型错误。完全虚构的例子,所以可能会觉得有点做作,但应该说明我遇到的问题。

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

我的 get 处理程序如下所示:

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

我做错了什么?

谢谢!

【问题讨论】:

    标签: haskell yesod


    【解决方案1】:

    尝试改变

    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
    

    【讨论】:

    • 谢谢@Jani。我试过了,我仍然得到一个错误。我摆脱了临时分配并将所有内容移至 entryForm 调用,但仍然出现错误。这次: 无法匹配预期的类型HandlerT site0 IO b0' with actual type Text'。在调用“personName”的返回类型中在“do”块的语句中:personName person
    • 非常感谢@Jani。这解决了以前的错误。还有一个问题:当我尝试在 entryForm 中使用“名称”时,出现错误:无法将预期类型“FieldSettings site0”与实际类型“文本”匹配。如果 name 是 Text,直接将其传递给 areq 与传递带引号的文本值不一样吗?
    • @Ecognium 我不是 100% 确定,但至少在您的示例中,表单函数中有两个参数 Text -&gt; Text -&gt; ...,但只有一个绑定变量 n1。这可能是它的原因。
    • 再次感谢@Jani。抱歉,我从我的用例中创建了一个简单的示例,但我错误地保留了 2 参数定义。在我的实际代码中,我有 2 个参数,我收到一条错误消息,说我需要传入一种 FieldSettings。我创建了一个突出问题的独立版本(无关系):pastebin.com/WcyhWETf。关于为什么我在将文本作为参数传递时遇到问题的任何想法?如果有意义,我可以将其作为一个单独的问题打开。
    • @Ecognium 是的,可能应该打开另一个问题,因为我使用 yesod 表格已经有一段时间了,所以我不完全确定这是怎么回事:)
    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2019-05-26
    • 2011-09-21
    • 2011-05-31
    相关资源
    最近更新 更多