Grails 3 gson 视图和域 class 模板

Grails 3 gson views and domain class template

我正在玩弄 Grails 3,特别是 REST Api 支持功能。

其中一项新功能(来自 2.5.5)是新的 gson 视图。

我正在尝试遵循 documentation,但我的模板似乎被忽略了。

我已经在 github 上提供了我的示例项目,但重要的部分在这里:

我的UrlMapping:

"/books"(resources: "book")

我的 Book 域 class:

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"}

我上网找了一些例子,发现 this one

这让我相信 Grails 应该忽略或绕过我的 show.gson 并只呈现我的 _book.gson,但那并没有发生。我尝试删除我的 show.gson,但随后出现空白页。

Grails documentation 让我相信我的 show.gson 应该呈现我的 _book.gson 模板,但这也没有发生。

我试过清理并重新运行,但我得到了相同的结果。

我能够使用完全限定的模板名称使其工作:

"Fixed" show.gson:

model {
   Book book
}
json g.render(template: "/book/book", model: [book: book])

可行,但不理想,而且不是文档中的内容。

我不确定我在这里做错了什么,我一定是遗漏了什么。

[更新]

既然你在学习,那就跟着学吧:)。以正确的方式去做

  1. 通过 运行 创建新项目:

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

  1. 导航到您的项目文件夹:

cd my-app-name

  1. 创建一本名为 restful-domain-class 的书:

grails create-domain-resource mochi.book

这将为您生成一个带有书名的域class,并使用@Resource 注释对其进行注释。您可以将标题字段添加到此域 class

    package mochi

import grails.rest.*

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

    String title

}

  1. 您不需要在您的控制器中定义保存方法,只需将您的域class标记为@Resource 的资源,Grails 将为您生成一个控制器,其中包含所有REST-API 操作。当您使用上面的 "create-domain-resource" 时,注释应该已经为您准备好了,正如我在代码片段中显示的那样。

  2. 此外,您不需要为了定义显示方法而创建控制器。 Grails 自动为任何标有@Resource 注释的域class 创建一个控制器。如果你确实想创建一个控制器,我推荐两个选项:

    我。使用命令:

grails create-restful-controller mochi.Book

这会在您的控制器目录中为您的书 class 创建一个 restful 控制器。这个控制器从一个名为 RestfulController 的 class 扩展而来,这个 class 已经定义了执行所有 RESTFUL-API 操作的方法,包括 show.

二。使用命令:

grails generate-controller mochi.Book

这将创建一个包含所有 RESTFUL-API 操作的控制器。它不会扩展任何 class,因为所有这些操作都将直接在此 class 中定义。

注意:您很少需要接触这些操作。所以我推荐第一个选项。它使您的代码简单明了。

  1. 现在有了视图,我总是从 grails 离开我的地方开始:)。 Grails 知道把东西放在哪里。要为您的图书域创建视图,我不建议您手动执行。 首先,当您不创建任何视图时,要知道 grails 会在 run-time 为您创建一个视图。但看起来,您想编辑此文件。所以让 Grails 生成它们,然后从那里编辑它们。很有趣,不是吗?

使用命令:

grails generate-views mochi.Book

这将在正确的目录中创建您手动创建的所有文件和模板 yourself.Including _book 模板文件。您可以从此处在 views/book 文件夹中编辑它们。

尝试创建新项目并测试所有这些功能,以了解它们的外观。

  1. 最后,如何将数据输入 domain-class。 grails-app/init/Bootsrap.groovy里面有个文件。在此处添加您的 objects,将为您提供可用信息。
    package stack1

import mochi.Book

class BootStrap {

    def init = { servletContext ->
        new Book(title: "Languages").save()
        new Book(title: "Maths").save()
    }
    def destroy = {
    }
}

每次您的应用程序启动时都会执行此文件

Check a screenshot of the location of my views

希望对您有所帮助。 谢谢...

目前 g.render 不是为正在传入的对象寻找模板,假设它不是项目列表。但是,它将查找该项目属性的模板。

我创建了一个问题来更改视图 1.2 中的行为 https://github.com/grails/grails-views/issues/117