2012-06-05 4 views
3

Я пишу небольшое приложение для хобби. Теперь в моем приложении я хочу, чтобы у людей был userId (так же, как у меня есть niklassaers здесь, при переполнении стека), и если он уже сделан, я хочу, чтобы пользователь получил ошибку, чтобы он мог выбрать другую.Пользовательская проверка формы Play 2.0 (scala)

Здесь следует мой объект Registration, он дает мне ошибку в строке «mapping (»: «отсутствующие аргументы для сопоставления методов в объектных формах», следуйте этому методу с помощью «_», если вы хотите рассматривать его как частично примененное функция»

object Signup extends Controller { 

    val userForm: Form[UserProfile] = Form(
    mapping(
     "userId" -> nonEmptyText, 
     "passwordHash" -> nonEmptyText, 
     "email" -> email 
    ) verifying (
     "ThisIsATest", { case(userId, passwordHash, email) => true } 
     // "UserID already taken", { DBService.exists(UserProfile.getClass().getName(), userId) } 
    )(UserProfile.apply)(UserProfile.unapply)) 


    def index = Action { 

    Ok(views.html.signup(userForm)) 
    } 

    def register = Action { implicit request => 
    userForm.bindFromRequest.fold(
     errors => BadRequest(views.html.signup(errors)), 
     user => Redirect(routes.Profile.index)) 
    } 
} 

Как вы можете видеть, я заменил мою службу поиска с помощью контрольной проверки, которая просто возвращает TRUE, чтобы сделать пример менее сложным для полноты, это мой UserDetail случая класс:.

case class UserProfile(
        userId : String, 
        email: String, 
        passwordHash: String) 

Я новичок в Scala и играю новичка, поэтому мне очень жаль если это очень тривиальный вопрос. Но:

  1. Что я делаю неправильно, так как получаю эту ошибку?

  2. Это правильный способ добавить мою собственную проверку?

  3. Последующий вопрос: я перенаправляю, если все идет хорошо, но как мне перенаправить на страницу, ссылающуюся на только что подтвержденную форму?

Приветствия

Nik

+0

избавиться от vals в случае определения класса, реквизит класса класса по умолчанию неизменен – virtualeyes

+0

Спасибо за комментарий, сейчас я удалил vals, но ничего не меняет, правильно? Я все равно получаю ту же ошибку компиляции – niklassaers

ответ

5

Наконец получил вокруг этого: верификация не то, что происходит после отображения, это то, что происходит в ограничении. Так оно и должно быть

"userId" -> nonEmptyText.verifying("UserID already taken", userId => DBService.exists(UserProfile.getClass().getName().replace("$", ""), userId) == false), 

Я надеюсь, что это помогает другим, которые имеют ту же самую проблему :-)

+2

, я считаю, что вы можете проверить глобальность самой формы. Я еще не пробовал себя, но видел «завершающую» проверку в том, как вы пытались. – virtualeyes

+0

Спасибо за это решение, сработало, за исключением того, что мне пришлось изменить условие на getOrElse (None) == None –

3

Немного поздно, но в любом случае ..

Вы можете сделать проверку на весь «form- backing object "вместо одного поля, в котором вы оказались. Это похоже на первый код, опубликованный в описании проблемы. Проблема в том, что ваш проверочный блок должен быть после операторов apply/unapply.

case class UserRegistration(username: String, password1: String, password2: String) 

val loginForm = Form(
    mapping(
    "username" -> email, 
    "password1" -> text, 
    "password2" -> text 
) 
    (UserRegistration.apply)(UserRegistration.unapply) 
    verifying ("Passwords must match", f => f.password1 == f.password2) 
) 
+0

Я не знаю, что изменилось с тех пор, как вы ответили на это, но он больше не работает, мы получаем; 'Типы аргументов анонимной функции должны быть полностью известны' – Ashesh

+0

Я просто пробовал этот код, используя самую последнюю версию игры (2.3.4), и это выглядело нормально.Он даже не компилируется для вас? – janne

0

Даже позже, но все равно ... :)

Использование проверки на всей «объекта формы подложки» это не распространяется позволяют добавлять сообщения об ошибках отдельных полей в форме. Если вы хотите сделать это, см. Play! framework 2.0: Validate field in forms using other fields

Смежные вопросы