如何在 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
问题是,我无法弄清楚如何正确使用selectField
和optionsPersist
。我查看了源代码以获取线索,但我就是不知道如何处理它。
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】:我认为你快到了。问题似乎不在于您如何调用selectField
或processOptions
。问题是该调用的结果将是Entity Process
,而Report
中的第二个字段是ProcessId
。所以你只需要使用fmap
(又名<$>
)进行转换。我相信以下会做到这一点:
entityKey <$> (areq (selectField processOptions) "Process" Nothing)
【讨论】:
以上是关于如何在 Yesod 中显示一个有很多关系的 <select>?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Yesod / Persistent 中正确使用 runDB