0

我正在玩 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 应该忽略或绕过 myshow.gson并只渲染 my _book.gson,但这并没有发生。我尝试删除我的show.gson,但后来我得到了一个空白页。

Grails 文档让我相信我show.gson应该渲染我的模板_book.gson,但这也没有发生。

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

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

“固定” show.gson

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

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

我不确定我在这里做错了什么,我一定错过了一些东西。

4

2 回答 2

3

[更新]

既然,你正在学习,请跟随:)。以正确的方式做到这一点

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

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

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

cd 我的应用程序名称

  1. 创建一个名为 book 的 restful-domain-class:

grails 创建域资源 mochi.book

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

    包麻糬

import grails.rest.*

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

    String title

}

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

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

    一世。使用命令:

grails create-restful-controller mochi.Book

这将在你的控制器目录中为你的 book 类创建一个 restful 控制器。这个控制器扩展自一个叫做 RestfulController 的类,这个类已经定义了方法来执行所有 RESTFUL-API 操作,包括 show。

ii. 使用命令:

grails 生成控制器 mochi.Book

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

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

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

使用命令:

grails 生成视图 mochi.Book

这将创建您自己手动创建的所有文件和模板。包括 _book 模板文件,在正确的目录中。您可以从此处在您的视图/书籍文件夹中编辑它们。

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

  1. 最后,如何将数据放入域类。grails-app/init/Bootsrap.groovy 中有一个文件。在此处添加您的对象,您将可以使用它。
    包堆栈1

进口麻糬.Book

类引导程序 {

    def init = { servletContext ->
        新书(标题:“语言”).save()
        新书(标题:“数学”).save()
    }
    def 销毁 = {
    }
}

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

检查我的视图位置的屏幕截图

我希望这有帮助。谢谢...

于 2016-11-21T14:07:29.897 回答
0

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

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

于 2017-02-27T06:19:18.283 回答