Леса Grails с дружественными надписями (вместо идентификационных ключей) для ассоциаций внешних ключей - PullRequest
7 голосов
/ 10 февраля 2012

Я пытаюсь использовать Grails Scaffolding, чтобы собрать быстрое приложение CRUD вокруг некоторых устаревших таблиц базы данных (см. этот предыдущий вопрос StackOverflow для саги до сих пор). Сейчас я преодолел худшую из проблем и имею работающее приложение CRUD, но осталась одна проблема с общим удобством использования.

Многие из моих доменных объектов имеют ассоциации внешних ключей с другими объектами домена. Contact принадлежит Owner и т. Д.

Однако на страницах CRUD для Contact я не хочу видеть фактический ключ id для Owner ..., потому что это ничего не значит для пользователей. Я хочу, чтобы на экране отображалось более удобное для человека значение Owner.name.

Представления «список» и «показ» явно имеют дело со всеми атрибутами в автоматически сгенерированном коде представления, и у меня есть возможность настроить этот код для управления тем, что представлено. Однако представления «создать» и «редактировать» не перечисляют все атрибуты. Вместо этого в этих представлениях делается какой-то вызов тега Grails, подобный следующему:

...
<fieldset class="form">
    <g:render template="form"/>
</fieldset>
...

Этот вызов, по-видимому, автоматически определяет во время выполнения, что такое поля, и сам принимает решение о том, как их отображать. Для доменных объектов, имеющих ассоциации, неправильное решение заключается в отображении идентификатора бессмысленного связанного объекта, а не более дружественного для человека атрибута.

Существует ли "простой" (или, по крайней мере, "лучший метод") способ изменения способа отображения полей в представлении "изменить" или "создать"? Конечно, это общая проблема, когда использование Scaffolding используется с объектами домена, имеющими ассоциации.

1 Ответ

16 голосов
/ 10 февраля 2012

О, да ... Вы можете просто реализовать метод "toString()" на связанном доменном объекте, чтобы он возвращал поле, которое вы хотите использовать для целей отображения:

class Owner {

    String id  // not human-friendly
    String name  // human-friendly
    // ...etc...

    String toString() {
        return name
    }
}

Теперь, когда вы находитесь в CRUD View для Contact, в котором есть поле для ассоциации Owner, на экране отображается атрибут Owner.name, а не Owner.id или какая-то уродливая ссылка на объект .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...