2012-12-09 2 views
0

사용자가 사용자 이름을 업데이트 할 수있는 양식이 있습니다. 사용자 이름은 고유해야합니다. 나는 Yesod 책에 언급 된 표준 유효성 검사를 사용하여 생각 : Forms를,하지만 난 그것의 주위에 ... 관련 데이터베이스 정의 내 머리를하지 않습니다데이터베이스의 값을 기반으로 폼 유효성 검사

Profile 
    username Text 
    user UserId 
    UniqueProfile user 
    UniqueUsername username 

가 검증없이, 사용자가 오류 -을 받게됩니다 (db-level에 대한 username-uniqueness 제약 조건 때문에). 좀 더 친근 해지기를 바랍니다.

어떻게 해결할 수 있습니까? 유효성 검사에서 사용자 이름이 채워진 행을 계산해야하며 로그인 한 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 

답변

1

나는 당신이 필드의 유효성 검사 중에 임의의 조치를 수행 할 수 있도록 할 checkM 기능을 찾고 생각합니다.

+0

그 해결책을 안내했다. 감사! – davidbe