0

ユーザーがユーザー名を更新できるフォームがあります。ユーザー名は一意である必要があります。Yesodの本:Formsで言及されているように、標準の検証を使用することを考えましたが、頭がおかしくなりません...関連するデータベース定義:

Profile
    username Text
    user UserId
    UniqueProfile user
    UniqueUsername username

検証を行わないと、ユーザーはエラーページを受け取ります(dbレベルでのユーザー名の一意性の制約のため)。もっと親しみやすくしたいです。

どうすればこれを解決できますか?検証では、ユーザー名が入力された行をカウントし、ログインしたUserIdとは異なる必要があると考えていました(ユーザーは他のアイテムも更新してユーザー名を保持できます)。Leftしかし、その結果を検証の一部で使用するにはどうすればよいですか?


解決策

profileForm :: Maybe ProfileForm -> Form ProfileForm
profileForm mpf = renderBootstrap $ ProfileForm
        <$> areq usernameField (FieldSettings {fsLabel = "Username", fsTooltip = Nothing, fsId = Nothing, fsName = Nothing, fsAttrs = [("autofocus","autofocus")]}) (pfUsername <$> mpf)
    where
        unav x = do
            (Entity uid _) <- requireAuth
            usernamecount <- runDB $ count [ ProfileUsername ==. x 
                                          , ProfileUser !=. uid ]
            return $ if usernamecount > 0
                        then Left ("Username already taken" :: Text)
                        else Right x

        usernameField = checkM unav textField
4

1 に答える 1

1

checkMフィールドの検証中に任意のアクションを実行できる関数を探していると思います。

于 2012-12-10T05:30:40.873 に答える