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 回答