У меня есть следующие POJO / POGO:

class Person {
    String firstName
    String lastName
    int age
    // ... lots of other fields
}

И контроллер Grails 2.3.6:

class PeopleController {
    List<Person> people = new ArrayList<Person>()

    def populatePeople() {
        // Add lots of people to the 'people' list.
    }

    def doSomething() {
        populatePeople()

        render(
            view: "people", 
            model:[
                people: people,
            ]
        )
    }
}

А потом в GSP:

<div id="peopleSelector">
    <g:select name="people" from="${people}" />
</div>

Когда я запускаю свое приложение, я получаю элемент <select> с com.me.myapp.domain.Person@398r4d99, значения которого выглядят как <option> s. Очевидно, что Grails не десериализует мои экземпляры Person в красивую печатную форму.

Я хочу, чтобы имена и фамилии людей появлялись в качестве вариантов выбора. Следовательно, если один из экземпляров Person в списке people:

Person smeeb = new Person(firstName: "Smeeb", lastNname: "McGuillocuty")

Тогда я ожидал бы, что " Smeeb McGuillocuty " будет вариантом выбора в окончательном HTML. Как я могу этого добиться?

1
smeeb 23 Окт 2014 в 20:46

2 ответа

Лучший ответ

Добавьте следующий метод в свой класс Person:

@Override public String toString() {
    "$firstName $lastName"
}

И, что несколько не связано с фактическим вопросом, вам возможно придется добавить идентификатор в строки параметров, чтобы однозначно идентифицировать человека. Предполагая, что класс Person имеет свойство id:

<g:select name="people" from="${people}" optionKey="id" />

Так что вы получите следующий HTML:

<select name="people" id="people">
    <option value="123">Smeeb McGuillocuty</option>
    :

Полезная ссылка на официальный документ: http://grails.org/doc/latest/ref /Tags/select.html: "..Поведение по умолчанию - вызов toString() для каждого элемента в атрибуте from .."

2
sebnukem 23 Окт 2014 в 17:09

Если вы не можете / не хотите "жертвовать" toString() ради рендеринга в HTML, вы также можете указать g:select, как рендерить параметры. Либо указав имя свойства в optionValue (например, optionValue="fullName", а затем предоставив метод String getFullName() (следите за переходными процессами, если вы передаете объект GORM)), либо предоставив его напрямую в GSP:

<g:select name="person" optionKey="theId" optionValue='${{"$it.lastName, $it.firstName"}}' from="${people}" />
1
cfrick 23 Окт 2014 в 17:10