2012-08-24 6 views
7

私は申請書を作成しようとしています。他のフィールドに依存するフィールドを検証するフォームを実装する方法が不思議でした。たとえば、passwordconfirm_passwordのフィールドを持つ登録フォームは、password == confirm_passwordを検証したいと思います。複数のフィールドにまたがるバリデーション

フォームが実行された後に、ハンドラで実行できますが、エラーメッセージが失われることがあります。

編集:は言及を忘れ、私は主にYesods Applicativeのフォームを使用していますが、彼らはあなたが帳票システムの

答えて

7

どのような種類を使用している消化器・ファンクタに非常に近いように見えますか?あなたが簡単にdigestive-functorsでこれを行うことができ、ここに私の登録フォームの1の例です:

ここ
registrationForm = 
    Registration 
     <$> "username" .: text Nothing 
     <*> "password" .: passwordConfirmer 
    where passwordConfirmer = 
      validate fst' $ (,) <$> ("p1" .: text Nothing) 
           <*> ("p2" .: text Nothing) 
     fst' (p1, p2) | p1 == p2 = Success p1 
         | otherwise = Error "Passwords must match" 

あなたは私のpasswordConfirmerフォームフィールドを使用して、私は私の「パスワード」フィールドの値を生成見ることができます。このフィールドは2つのテキストフィールドを使用し、それらをタプルに入れますが、検証後にはfst要素が使用されます(ただし、sndとなる可能性があります)。

マイRegistrationタイプがある:

data Registration = Registration 
    { regUserName :: Text 
    , regPassword :: Text 
    } 
+0

私はyesods Applicativeのフォームを使用していますが、これはあまりにも良い答えです – Masse

関連する問題