【问题标题】:Grails 3 gson views and domain class templateGrails 3 gson 视图和域类模板
【发布时间】:2017-04-04 14:28:09
【问题描述】:

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

新功能之一(来自 2.5.5)是新的 gson 视图。

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

我已经在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"}

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

这让我相信 Grails 应该忽略或绕过我的 show.gson 并只渲染我的 _book.gson,但这并没有发生。我尝试删除我的show.gson,但我得到了一个空白页。

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

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

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

“固定”show.gson:

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

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

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

【问题讨论】:

    标签: grails json-view grails3.2.0


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      [更新]

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

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

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

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

      cd my-app-name

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

      grails create-domain-resource mochi.book

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

      包麻糬
      import grails.rest.*
      
      @Resource(readOnly = false, formats = ['json', 'xml'])
      class Book {
      
          String title
      
      }
      

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

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

        我。使用命令:

      grails create-restful-controller mochi.Book

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

      二。使用命令:

      grails generate-controller mochi.Book

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

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

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

      使用命令:

      grails generate-views mochi.Book

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

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

      1. 最后,如何将数据放入域类。 grails-app/init/Bootsrap.groovy 中有一个文件。在此处添加您的对象,您将可以使用它。
      包堆栈1 进口麻糬.Book 类引导程序 { def init = { servletContext -> 新书(标题:“语言”).save() 新书(标题:“数学”).save() } def 销毁 = { } }

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

      Check a screenshot of the location of my views

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

      【讨论】:

      • 我很困惑,我的Book域在mochi.Book下,所以我需要把我的观点放在views/mochi/book/下,例如views/mochi/book/_book.gson吗?这是 3.x 的新功能吗?除非我有多个具有相同名称的域对象,否则我从来不需要将视图放在包名称下,因此需要命名空间。
      • 我尝试将_book.gson 模板移动到包目录中,但没有成功。
      • 我已经编辑了答案以使其更加详细。希望对你有帮助
      • @Townsfolk 你可以查看他们
      猜你喜欢
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2019-04-08
      相关资源
      最近更新 更多