(快速参考)

19 Scaffolding

版本 6.2.0

19 Scaffolding

使用 Scaffolding 可为您生成一些基础的 CRUD 接口,供各种领域类使用,包括

  • 必需的 视图

  • 建立/读取/更新/删除 (CRUD) 操作的控制器操作

应用程序需表达对 scaffolding 插件的依赖方式是在 build.gradle 中包含以下内容。

dependencies {
        // ...
        implementation "org.grails.plugins:scaffolding"
        // ...
    }

动态 Scaffolding

开始使用 scaffolding 的最简单方式是,通过将控制器的 scaffold 属性设为特定领域类来启用

class BookController {
    static scaffold = Book  // Or any other domain class such as "Author", "Publisher"
}

通过此配置,在您启动应用程序时,操作和视图将在运行时自动生成。以下操作由运行时 scaffolding 机制以默认方式动态实现

  • 索引

  • 显示

  • 编辑

  • 删除

  • 创建

  • 保存

  • 更新

还将生成一个 CRUD 接口。要访问这个接口,请在浏览器中打开 http://localhost:8080/book

注意:定义 scaffold 属性的旧式选择

class BookController {
    static scaffold = true
}

已不在 Grails 3.0 以上版本中受支持。

如果您愿意用 Java 保存领域模型,并且 (用 Hibernate 映射),仍可以使用 scaffolding,只需导入领域类并将其名称设为 scaffold 参数即可。

您可以为 scaffolding 的控制器添加新的操作,例如

class BookController {

    static scaffold = Book

    def changeAuthor() {
        def b = Book.get(params.id)
        b.author = Author.get(params["author.id"])
        b.save()

        // redirect to a scaffolded action
        redirect(action:show)
     }
}

您还可覆盖 scaffolding 操作

class BookController {

    static scaffold = Book

    // overrides scaffolded action to return both authors and books
    def index() {
        [bookInstanceList: Book.list(),
         bookInstanceTotal: Book.count(),
         authorInstanceList: Author.list()]
    }

    def show() {
        def book = Book.get(params.id)
        log.error("{}", book)
        [bookInstance : book]
    }
}

所有这些操作都被称为“动态 scaffolding”,在此,CRUD 接口是在运行时动态生成的。

默认情况下,scaffolding 视图中文本区域的大小在 CSS 中定义,因此添加“行”和“列”属性不会产生任何效果。

此外,标准脚手架视图期望集合的模型变量形式为< propertyName>InstanceList,而单实例形式为< propertyName>Instance。使用“books”和“book”等属性很有吸引力,但它们不起作用。

静态脚手架

通过命令行,Grails 允许你生成一个控制器并生成用来创建上述界面的视图。若要生成一个控制器类型

grails generate-controller Book

或生成视图

grails generate-views Book

或生成所有内容

grails generate-all Book

如果你在一个包中有一个域类或者从一个Hibernate 映射类生成,请记住包含完全合格的包名称

grails generate-all com.bookstore.Book

自定义生成视图

视图适应于验证约束。例如,你可以在视图中更改字段出现的顺序,只需重新排序生成器中的约束

def constraints = {
    title()
    releaseDate()
}

如果你使用inList约束,还可以让生成器生成列表,而不是文本输入

def constraints = {
    title()
    category(inList: ["Fiction", "Non-fiction", "Biography"])
    releaseDate()
}

或如果你对数字使用range约束

def constraints = {
    age(range:18..65)
}

使用约束限制大小也会影响可以在 d 视图中输入的字符数

def constraints = {
    name(size:0..30)
}

字段插件

Grails 脚手架模板使用字段插件。一旦你生成了脚手架视图,便可以使用插件提供的Taglib自定义表单和表格(有关详细信息,请参见字段插件文档)。

<%-- Generate an HTML table from bookInstanceList, showing only 'title' and 'category' columns --%>
<f:table collection="bookInstanceList" properties="['title', 'category']"/>

自定义脚手架模板

通过使用install-templates命令安装模板,Grails 可以使用模板自定义用于生成控制器和视图的模板。