2013-10-12 7 views
7

Próbuję powiązać seq tekstu z formularzem scala. To, co mam tak daleko jest następujący kod:Graj! Framework with scala - Form seq (text) binding

val registerForm = Form[User](
mapping(
    "login" -> text, 
    "password" -> text, 
    "roles" -> seq(text) 
) { 
    (login, password, roles) => User(login = login, password = password, roles = roles) 
} { 
    user => Some((user.login, user.password, user.roles)) 
}) 

Moja forma jest wybrać HTML:

<select id="roles" name="roles" multiple="multiple"> 
    <option value="ADMIN">Admin</option> 
    <option value="TESTER">Tester</option> 
</select> 

Login i hasło są zbindowanych poprawnie. Mój problem polega na tym, że seq ról jest zawsze pusta.

Sprawdziłem obiekt żądania przekazany do metody kontrolera i (jeśli zaznaczono) obie role tam są - po prostu nie są prawidłowo bindowane w obiekcie formularza.

Wszelkie pomysły?

Edit:

Ja również wysłana na moje pytanie w play-ramowej Google Group (https://groups.google.com/forum/#!topic/play-framework/KcbiF9K3d8w) i otrzymał tam odpowiedź. Rozwiązaniem jest podanie nazwy: "role []" zamiast "role".

+2

można opublikować odpowiedź w sekcji odpowiedzi i oznaczyć ją jako właściwą odpowiedź ? –

Odpowiedz

4

Wyliczyłem to.

Rozwiązaniem jest podanie nazwy: "role []" zamiast "role".

+0

To było naprawdę nieoczekiwane ... dzięki, działa jak czar! – mulya

0

Java play 2.3.7 przykładem wiązania Juz Form do select z atrybutem multiple:

<select name="bar[]" multiple> 
     <option value="bar-1">Bar</option> 
     <option value="bar-2">Bar Bar</option> 
     <option value="bar-3">Bar Bar Bar</option> 
</select> 

z Form:

public class FooForm { 
    public List<String> bar; 
} 

I Controller Oprawa:

FooForm fooForm = Form.form(FooForm.class).bindFromRequest().get(); 
Logger.info(fooForm.bar.get(0)); 
Logger.info(fooForm.bar.get(1)); 

Testowałem z tablicami (tj. String[]) i działa tylko z List<>.

Mam nadzieję, że to pomoże.


Uwaga: dziwne, to działa tylko wtedy, gdy klasa Form (FooForm) znajduje się w tym samym opakowaniu co sterownik, lub w tej samej klasie i static. Wygląda na to, że jest to błąd.

Jeśli chcesz użyć innego pakietu (tj controllers.forms), to trzeba pobierające i ustawiające w klasie formularza:

public class FooForm { 
    private List<String> bar; 

    public List<String> getBar() { return bar; } 
    public void setBar(List<String> bar) { this.bar = bar; } 
}