如何在 Yesod 中显示一个有很多关系的 <select>?

Posted

技术标签:

【中文标题】如何在 Yesod 中显示一个有很多关系的 <select>?【英文标题】:How can I show a <select> for a has many relationship in Yesod? 【发布时间】:2014-06-13 01:33:51 【问题描述】:

我有一个简单的一对多关系,这样说

Process
    name Text

Report
    time Text
    process ProcessId

我想创建一个用于创建帖子的表单,我可以在其中从现有用户列表中进行选择。像这样的。

processOptions :: Handler (OptionList (KeyBackend SqlBackend Process))
processOptions = optionsPersist [] [Desc ProcessName] id

postForm = renderDivs $ Report
             <$> areq textField "Time" Nothing
             <*> areq (selectField processOptions) "Process" Nothing

问题是,我无法弄清楚如何正确使用selectFieldoptionsPersist。我查看了源代码以获取线索,但我就是不知道如何处理它。

optionsPersist 的预期类型似乎是 Handler (OptionList (KeyBackend SqlBackend Process)),尽管它实际返回的是 Handler (OptionList (Entity Process))。我不确定我是否遗漏了什么,或者是否需要进行一些解包。

这是实际的错误信息

Couldn't match type ‘Entity (ProcessGeneric SqlBackend)’
              with ‘KeyBackend SqlBackend Process’
Expected type: Handler (OptionList (KeyBackend SqlBackend Process))
  Actual type: HandlerT
                 App IO (OptionList (Entity (ProcessGeneric SqlBackend)))

is a question for a similar topic,我不认为这是重复的,因为这个问题是关于使用optionsPersist,而另一个问题只是手动生成选项。

【问题讨论】:

【参考方案1】:

认为你快到了。问题似乎不在于您如何调用selectFieldprocessOptions。问题是该调用的结果将是Entity Process,而Report 中的第二个字段是ProcessId。所以你只需要使用fmap(又名&lt;$&gt;)进行转换。我相信以下会做到这一点:

entityKey <$> (areq (selectField processOptions) "Process" Nothing)

【讨论】:

以上是关于如何在 Yesod 中显示一个有很多关系的 <select>?的主要内容,如果未能解决你的问题,请参考以下文章

Yesod 持久示例

如何使用 Yesod/Persistent 创建外键约束?

如何在 Yesod / Persistent 中正确使用 runDB

Yesod:如何在终端或其他工具中记录查询时间?

在 Yesod 中强制 Julius 重新插值或如何避免在客户端繁重的应用程序中对服务器进行双重标记

使用持久键列表选择 (Yesod)