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

Use one form field for two Model entries in Yesod

我正在制作一个 link 聚合器,人们可以在其中提交文章。

我的数据模型包含

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

因为表格显然与文章类型不匹配。

我不确定如何进行。有人告诉我,我可以 a) 编写替代文章的数据类型并在两者之间进行转换,或者 b) 创建我自己的自定义字段,尽管这对我这个新手来说似乎很难。

我推荐一个辅助函数,例如:

makeArticle :: Text -> Text -> Article

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