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])
可行,但不理想,而且不是文档中的内容。
我不确定我在这里做错了什么,我一定是遗漏了什么。
[更新]
既然你在学习,那就跟着学吧:)。以正确的方式去做
- 通过 运行 创建新项目:
grails create-app my-app-name --profile rest-api
- 导航到您的项目文件夹:
cd my-app-name
- 创建一本名为 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
}
您不需要在您的控制器中定义保存方法,只需将您的域class标记为@Resource 的资源,Grails 将为您生成一个控制器,其中包含所有REST-API 操作。当您使用上面的 "create-domain-resource" 时,注释应该已经为您准备好了,正如我在代码片段中显示的那样。
此外,您不需要为了定义显示方法而创建控制器。 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 中定义。
注意:您很少需要接触这些操作。所以我推荐第一个选项。它使您的代码简单明了。
- 现在有了视图,我总是从 grails 离开我的地方开始:)。 Grails 知道把东西放在哪里。要为您的图书域创建视图,我不建议您手动执行。
首先,当您不创建任何视图时,要知道 grails 会在 run-time 为您创建一个视图。但看起来,您想编辑此文件。所以让 Grails 生成它们,然后从那里编辑它们。很有趣,不是吗?
使用命令:
grails generate-views mochi.Book
这将在正确的目录中创建您手动创建的所有文件和模板 yourself.Including _book 模板文件。您可以从此处在 views/book 文件夹中编辑它们。
尝试创建新项目并测试所有这些功能,以了解它们的外观。
- 最后,如何将数据输入 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
我正在玩弄 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])
可行,但不理想,而且不是文档中的内容。
我不确定我在这里做错了什么,我一定是遗漏了什么。
[更新]
既然你在学习,那就跟着学吧:)。以正确的方式去做
- 通过 运行 创建新项目:
grails create-app my-app-name --profile rest-api
- 导航到您的项目文件夹:
cd my-app-name
- 创建一本名为 restful-domain-class 的书:
grails create-domain-resource mochi.book
这将为您生成一个带有书名的域class,并使用@Resource 注释对其进行注释。您可以将标题字段添加到此域 class
package mochiimport grails.rest.* @Resource(readOnly = false, formats = ['json', 'xml']) class Book { String title }
您不需要在您的控制器中定义保存方法,只需将您的域class标记为@Resource 的资源,Grails 将为您生成一个控制器,其中包含所有REST-API 操作。当您使用上面的 "create-domain-resource" 时,注释应该已经为您准备好了,正如我在代码片段中显示的那样。
此外,您不需要为了定义显示方法而创建控制器。 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 中定义。
注意:您很少需要接触这些操作。所以我推荐第一个选项。它使您的代码简单明了。
- 现在有了视图,我总是从 grails 离开我的地方开始:)。 Grails 知道把东西放在哪里。要为您的图书域创建视图,我不建议您手动执行。 首先,当您不创建任何视图时,要知道 grails 会在 run-time 为您创建一个视图。但看起来,您想编辑此文件。所以让 Grails 生成它们,然后从那里编辑它们。很有趣,不是吗?
使用命令:
grails generate-views mochi.Book
这将在正确的目录中创建您手动创建的所有文件和模板 yourself.Including _book 模板文件。您可以从此处在 views/book 文件夹中编辑它们。
尝试创建新项目并测试所有这些功能,以了解它们的外观。
- 最后,如何将数据输入 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