ユーザーがユーザー名を更新できるフォームがあります。ユーザー名は一意である必要があります。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