2015-04-08 1 views
1

Я создаю агрегатор ссылок, где люди могут отправлять статьи.Используйте одно поле формы для двух записей модели в 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 

, потому что ясно форма не соответствует тип статьи.

Я не уверен, как действовать. Мне сказали, что я могу либо a) написать альтернативный тип данных статьи и конвертировать между ними, либо b) создать свое собственное пользовательское поле, хотя оба из них кажутся мне трудными как новичок.

ответ

1

Я рекомендовал бы вспомогательную функцию, как:

makeArticle :: Text -> Text -> Article 

Который берет название и URL, извлекает имя домена из URL, и строит Article значение. Затем вы можете использовать это вместо прямого вызова конструктора данных Article.

Смежные вопросы