Grails 3 представления gson и шаблон класса домена
Я играю с Grails 3, в частности с функциями поддержки REST Api.
Одна из новых функций (начиная с 2.5.5) - это новые представления gson.
Я пытаюсь следовать документации, но мой шаблон, кажется, игнорируется.
Я сделал мой пример проекта доступным на github, но здесь есть важные моменты:
мой UrlMapping
:
"/books"(resources: "book")
мой Book
класс домена:
class Book {
String title
static constraints = {
title(blank: false)
}
}
От моего BookController
:
def show(Book book) {
respond new Book(id: 1, title: "Foo bar")
}
мой show.gson
:
model {
Book book
}
json g.render(book)
Наконец, мой book/_book.gson
:
json {
title "Book Template"
}
Что я вижу в браузере с этой настройкой:
{"title":"Foo bar"}
Я посмотрел в Интернете несколько примеров и нашел этот
Что заставляет меня верить, что Grails должен игнорировать или обходить мой show.gson
и просто сделать мой _book.gson
, но этого не происходит. Я пытался удалить мой show.gson
, но потом я получил пустую страницу.
Документация Grails заставляет меня поверить, что мой show.gson
должен сделать мой _book.gson
шаблон, но этого тоже не происходит.
Я пытался очистить и снова запустить, но я получаю тот же результат.
Я смог заставить его работать, используя полное имя шаблона:
"Исправлена" show.gson
:
model {
Book book
}
json g.render(template: "/book/book", model: [book: book])
Работоспособный, но не идеальный, и не то, что в документах.
Я не уверен, что я делаю не так, я должен что-то упустить.
2 ответа
[ОБНОВЛЕНО]
Так как, вы учитесь, пожалуйста, следуйте:). Чтобы сделать это правильно
- Создайте новый проект, запустив:
grails create-app my-app-name --profile rest-api
- Перейдите в папку вашего проекта:
cd my-app-name
- Создайте restful-domain-class под названием book:
Граальс создать-домен-ресурс mochi.book
Это создаст для вас класс домена с книгой имен и аннотирует его аннотацией @Resource. Вы можете добавить свое поле заголовка в этот класс домена
пакет мотиimport grails.rest.* @Resource(readOnly = false, formats = ['json', 'xml']) class Book { String title }
Вам не нужно определять метод save в вашем контроллере, просто пометьте свой класс домена как ресурс с помощью @Resource, Grails сгенерирует для вас контроллер со всеми операциями REST-API. Когда вы используете "create-domain-resource" выше, аннотация уже должна быть там для вас, как я показал в моем фрагменте кода.
Более того, вам не нужно создавать контроллер просто для определения метода show. Grails автоматически создает контроллер для любого класса домена, помеченного аннотацией @Resource. Если вы хотите создать контроллер, я рекомендую два варианта:
я. С помощью команды:
grails create-restful-контроллер моти.Книга
Это создаст спокойный контроллер для вашего класса книги в вашем каталоге контроллеров. Этот контроллер происходит от класса RestfulController, этот класс уже определяет методы для выполнения всех операций RESTFUL-API, включая show.
II. С помощью команды:
Граальс генератор-контроллер моти.Книга
Это создаст контроллер со всеми операциями RESTFUL-API. Он не будет расширять ни один класс, так как все эти операции будут определены непосредственно в этом классе.
NB. Редко вам может потребоваться коснуться этих операций. Поэтому я рекомендую первый вариант. Он сохраняет ваш код простым и чистым.
- Теперь с представлениями я всегда начинаю с того места, где меня покидает Грааль:). Граальс знает, куда положить вещи. Чтобы создавать представления для своего книжного домена, я не рекомендую делать это вручную. Прежде всего, когда вы не создаете какой-либо вид, знайте, что Grails создает его для вас во время выполнения. Но, как кажется, вы хотите отредактировать этот файл. Так что позвольте Grails генерировать их, а затем редактировать их оттуда. Веселье, не правда ли?
Используйте команду:
Граальс генерирует-просмотров моти.Книга
Это создаст все файлы и шаблон, который вы создаете сами. В том числе файл шаблона _book, в нужном каталоге. Вы можете редактировать их отсюда, внутри вашей папки views/book.
Попробуйте создать новые проекты и протестировать все эти функции, чтобы узнать, как они выглядят.
- Наконец, как вы получаете данные в свой домен-класс. Внутри grails-app/init/Bootsrap.groovy есть файл. Добавьте ваши объекты сюда, и там будет для вас.
пакет stack1 импорт моти.Книга class BootStrap { def init = { servletContext -> Новая книга (название: "Языки").save() новая книга (название: "Математика").save() } def destroy = { } }
Этот файл выполняется каждый раз, когда ваше приложение запускается
Проверьте скриншот расположения моих просмотров
Надеюсь, это поможет. Спасибо...
В настоящее время g.render
не предназначен для поиска шаблона для передаваемого объекта, предполагая, что это не список элементов. Однако он будет искать шаблоны для свойств этого элемента.
Я создал проблему для изменения поведения в представлениях 1.2 https://github.com/grails/grails-views/issues/117