ユーザーが自分のサーバーにファイルをアップロードできるフォームを作成しようとしています。Yesodがそのような機能にfileAFormReqを使用しているのを見ましたが、それを機能させることができず、コンパイルエラーが発生しました。最新のエラーは、「(RenderMessage MySite t)のインスタンスはありません」です。高く評価。ありがとう、ウリ
2059 次
1 に答える
13
2012 年 9 月 13 日更新:
ここにファイルのアップロードに関する公式に維持されたヘルプページがあります
関数をグーグルで検索すると、fileAFormReq
この例が得られました。
関連する部分だけを使って最小限のバージョンを作成しました。
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
import Yesod.Core
import Yesod.Form
import Yesod.Form.MassInput
import Control.Applicative
import Data.Text (Text, pack)
import Network.Wai.Handler.Warp (run)
import Data.Time (utctDay, getCurrentTime)
import qualified Data.Text as T
import Control.Monad.IO.Class (liftIO)
mkYesod "HelloForms" [parseRoutes|
/file FileR GET POST
|]
data HelloForms = HelloForms
instance RenderMessage HelloForms FormMessage where
renderMessage _ _ = defaultFormMessage
instance Yesod HelloForms where
approot _ = ""
main = toWaiApp HelloForms >>= run 3000
fileForm = renderTable $ pure (,)
<*> fileAFormReq "Required file"
<*> fileAFormOpt "Optional file"
getFileR = do
((res, form), enctype) <- runFormPost fileForm
defaultLayout [whamlet|
<p>Result: #{show res}
<form method=post enctype=#{enctype}>
<table>
^{form}
<tr>
<td>
<input type=submit>
|]
postFileR = getFileR
runhaskell
http://localhost:3000/file
これを確認してから、ブラウザでアクセスしてください。
お役に立てれば。:)
編集:
ちょっと待って、何が欠けているかは明らかです。コンパイル エラーが言ったRenderMessage
ように、Foundation のインスタンスがありません。
i18n の最近の取り組みにより、forms-package がわずかに変更されたことは知っています。yesod の最新バージョンを使用している場合は、こちらを確認してください。
貼り付けたコードは、古い非 i18n (デフォルトは英語) バージョンのyesod-forms
パッケージを使用しています。
于 2011-09-18T09:50:42.227 に答える