【问题标题】:How to get post data in yesod?如何在yesod中获取发布数据?
【发布时间】:2015-04-02 08:14:41
【问题描述】:

您好,我想在表格中手动插入数据,并且我使用了 lookupPostParam。

这是发布新新闻中的代码。

      postNewsR :: Handler Html
      postNewsR = do
                now <- liftIO getCurrentTime
                newsTitle <- lookupPostParam "title"
                newsUrl <- lookupPostParam "news_url"
                newsSnapshot <- lookupPostParam "news_snopshot"
                newsArea <- lookupPostParam "news_area"
                newsSubject <- lookupPostParam "news_subject"
                newsContent <- lookupPostParam "news_content"

               newsId <- runDB $ insert News newsTitle newsUrl newsSnapshot newsContent False Nothing now Nothing

              redirect NewsR

但它给了我以下错误:

      Couldn't match type ‘Control.Monad.Trans.Reader.ReaderT
                   (PersistEntityBackend
                      (Data.Text.Internal.Text
                       -> Data.Text.Internal.Text
                       -> Data.Text.Internal.Text
                       -> Data.Text.Internal.Text
                       -> Bool
                       -> Maybe Int
                       -> UTCTime
                       -> Maybe UTCTime
                       -> News))
                   m0
                   (Key
                      (Data.Text.Internal.Text
                       -> Data.Text.Internal.Text
                       -> Data.Text.Internal.Text
                       -> Data.Text.Internal.Text
                       -> Bool
                       -> Maybe Int
                       -> UTCTime
                       -> Maybe UTCTime
                       -> News))’
          with ‘Maybe Data.Text.Internal.Text
                -> Maybe Data.Text.Internal.Text
                -> Maybe Data.Text.Internal.Text
                -> Maybe Data.Text.Internal.Text
                -> Bool
                -> Maybe a0
                -> UTCTime
                -> Maybe a1
                -> Control.Monad.Trans.Reader.ReaderT
                     (YesodPersistBackend App) (HandlerT App IO) t0’
         Expected type: Maybe Data.Text.Internal.Text
           -> Maybe Data.Text.Internal.Text
           -> Maybe Data.Text.Internal.Text
           -> Maybe Data.Text.Internal.Text
           -> Bool
           -> Maybe a0
           -> UTCTime
           -> Maybe a1
           -> YesodDB App t0
         Actual type: Control.Monad.Trans.Reader.ReaderT
             (PersistEntityBackend
                (Data.Text.Internal.Text
                 -> Data.Text.Internal.Text
                 -> Data.Text.Internal.Text
                 -> Data.Text.Internal.Text
                 -> Bool
                 -> Maybe Int
                 -> UTCTime
                 -> Maybe UTCTime
                 -> News))
             m0
             (Key
                (Data.Text.Internal.Text
                 -> Data.Text.Internal.Text
                 -> Data.Text.Internal.Text
                 -> Data.Text.Internal.Text
                 -> Bool
                 -> Maybe Int
                 -> UTCTime
                 -> Maybe UTCTime
                 -> News))
      The function insert is applied to 9 arguments,
      but its type ‘(Data.Text.Internal.Text
           -> Data.Text.Internal.Text
           -> Data.Text.Internal.Text
           -> Data.Text.Internal.Text
           -> Bool
           -> Maybe Int
           -> UTCTime
           -> Maybe UTCTime
           -> News)
          -> Control.Monad.Trans.Reader.ReaderT
               (PersistEntityBackend
                  (Data.Text.Internal.Text
                   -> Data.Text.Internal.Text
                   -> Data.Text.Internal.Text
                   -> Data.Text.Internal.Text
                   -> Bool
                   -> Maybe Int
                   -> UTCTime
                   -> Maybe UTCTime
                   -> News))
               m0
               (Key
                  (Data.Text.Internal.Text
                   -> Data.Text.Internal.Text
                   -> Data.Text.Internal.Text
                   -> Data.Text.Internal.Text
                   -> Bool
                   -> Maybe Int
                   -> UTCTime
                   -> Maybe UTCTime
                   -> News))’

希望你能帮助我,在此先感谢

编辑:


我更改了代码中的某些内容。这是更新。 从lookupPostParam 到runInputPost

    newsTitle <- runInputPost $ ireq textField "title"
    newsUrl <- runInputPost $ ireq textField "news_url"
    newsSnapshot <- runInputPost $ ireq textField "news_snopshot"
    newsArea <- runInputPost $ ireq textField "news_snopshot"
    newsSubject <- runInputPost $ ireq textField "news_snopshot"
    newsContent <- runInputPost $ ireq textareaField "news_content"

    -- Inserting it to the table News
    newsId <- insert $ News newsTitle newsUrl newsSnapshot newsContent False Nothing now Nothing

现在它给了我 2 个错误:

 1. Couldn't match type ‘Control.Monad.Trans.Reader.ReaderT
                   SqlBackend m0’
          with ‘HandlerT App IO’
    Expected type: HandlerT App IO (Key News)
    Actual type: Control.Monad.Trans.Reader.ReaderT
             SqlBackend m0 (Key News) …

提前致谢。

【问题讨论】:

    标签: yesod yesod-forms


    【解决方案1】:

    看看你是如何定义你的News实体会很有帮助的...

    让我们看看有问题的函数的签名:

    lookupPostParam :: (MonadResource m, MonadHandler m)
                    => Text
                    -> m (Maybe Text)
    

    也就是说lookupPostParam 接受Text 参数,返回Maybe Text,并存在于m monad 中。当您调用 lookupPostParam 时,&lt;- 关键字会为我们解开 m monad。所以newsTitle

    newsTitle <- lookupPostParam "title"
    

    类型为Maybe Text。我想您的 News 将其字段定义为 Text 类型,因此您仍然必须处理 Maybe 才能将值插入数据库中。例如,

    case newsTitle of
     Nothing -> redirect NewsR -- and handle the error, return 400 perhaps
     Just title -> do
       newsUrl <- lookupPostParam "news_url"
       case newsUrl of
        Nothing -> redirect NewsR -- and handle the error
        Just url -> do
          -- and so on
    

    一旦您从lookupPostParam 的返回值中解包Maybe,您应该可以轻松地将它们应用到insert

    newsId <- runDB $ insert $ 
              News title url snapshot content False Nothing now Nothing
    

    查看Data.Maybe 或在此处回复如果您仍然卡住。

    【讨论】:

    • 你能选择我的答案,这样问题就结束了吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2015-07-20
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    相关资源
    最近更新 更多