在Yesod中为两个Model条目使用一个表单域

时间:2015-04-08 13:45:12

标签: haskell yesod

我正在制作一个人们可以提交文章的链接聚合器。

我的数据模型包含

Article
    title Text
    url Text
    domain Text

我希望用户在表单中输入一个url,然后在URL上运行一个函数来提取域,然后将它们保存在数据库中。 我希望用户只需输入一次URL,如:

entryForm = renderDivs $ Article¬
     <$> areq   textField "Url" Nothing¬
     <*> areq   textField "Title" Nothing¬

但是我收到了这个错误

Couldn't match type ‘Text -> Article’ with ‘Article’
  Expected type: Form Article
    Actual type: blaze-markup-0.7.0.0:Text.Blaze.Internal.Markup
               -> MForm
                    (HandlerT App IO)
                    (FormResult (Text -> Article),
                     WidgetT (HandlerSite (HandlerT App IO)) IO ())
In the expression:
  renderDivs
  $ Article <$> areq textField "Url" Nothing
    <*> areq textField "Title" Nothing
In an equation for ‘entryForm’:
    entryForm
      = renderDivs
        $ Article <$> areq textField "Url" Nothing
          <*> areq textField "Title" Nothing

因为显然表单与Article类型不匹配。

我不知道该怎么办。我被告知我可以a)写一篇替代文章&#39;数据类型和两者之间的转换,或b)创建我自己的自定义字段,虽然这些对我来说似乎很难成为新手。

1 个答案:

答案 0 :(得分:1)

我建议使用辅助函数,如:

makeArticle :: Text -> Text -> Article

获取标题和URL,从URL中提取域名,并构造Article值。然后,您可以使用它代替直接调用Article数据构造函数。