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 ответа

Решение

[ОБНОВЛЕНО]

Так как, вы учитесь, пожалуйста, следуйте:). Чтобы сделать это правильно

  1. Создайте новый проект, запустив:

grails create-app my-app-name --profile rest-api

  1. Перейдите в папку вашего проекта:

cd my-app-name

  1. Создайте restful-domain-class под названием book:

Граальс создать-домен-ресурс mochi.book

Это создаст для вас класс домена с книгой имен и аннотирует его аннотацией @Resource. Вы можете добавить свое поле заголовка в этот класс домена

    пакет моти

import grails.rest.*

@Resource(readOnly = false, formats = ['json', 'xml'])
class Book {

    String title

}

  1. Вам не нужно определять метод save в вашем контроллере, просто пометьте свой класс домена как ресурс с помощью @Resource, Grails сгенерирует для вас контроллер со всеми операциями REST-API. Когда вы используете "create-domain-resource" выше, аннотация уже должна быть там для вас, как я показал в моем фрагменте кода.

  2. Более того, вам не нужно создавать контроллер просто для определения метода show. Grails автоматически создает контроллер для любого класса домена, помеченного аннотацией @Resource. Если вы хотите создать контроллер, я рекомендую два варианта:

    я. С помощью команды:

grails create-restful-контроллер моти.Книга

Это создаст спокойный контроллер для вашего класса книги в вашем каталоге контроллеров. Этот контроллер происходит от класса RestfulController, этот класс уже определяет методы для выполнения всех операций RESTFUL-API, включая show.

II. С помощью команды:

Граальс генератор-контроллер моти.Книга

Это создаст контроллер со всеми операциями RESTFUL-API. Он не будет расширять ни один класс, так как все эти операции будут определены непосредственно в этом классе.

NB. Редко вам может потребоваться коснуться этих операций. Поэтому я рекомендую первый вариант. Он сохраняет ваш код простым и чистым.

  1. Теперь с представлениями я всегда начинаю с того места, где меня покидает Грааль:). Граальс знает, куда положить вещи. Чтобы создавать представления для своего книжного домена, я не рекомендую делать это вручную. Прежде всего, когда вы не создаете какой-либо вид, знайте, что Grails создает его для вас во время выполнения. Но, как кажется, вы хотите отредактировать этот файл. Так что позвольте Grails генерировать их, а затем редактировать их оттуда. Веселье, не правда ли?

Используйте команду:

Граальс генерирует-просмотров моти.Книга

Это создаст все файлы и шаблон, который вы создаете сами. В том числе файл шаблона _book, в нужном каталоге. Вы можете редактировать их отсюда, внутри вашей папки views/book.

Попробуйте создать новые проекты и протестировать все эти функции, чтобы узнать, как они выглядят.

  1. Наконец, как вы получаете данные в свой домен-класс. Внутри 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

Другие вопросы по тегам