在Grails中动态创建可用脚手架菜单

时间:2019-01-23 12:11:42

标签: java grails groovy

我的Grails应用程序中有一堆模型类,所有这些模型类都是用于动态构建各自数据库表的目的。对于应用程序的索引,我想要一个包含所有这些脚手架的菜单,以便在添加新模型的情况下更新菜单。

是否有任何自动的Grails方法来执行此操作,或者我是否坚持为每个类静态地键入g:link来创建天真的索引视图,以将用户带到各自的CRUD视图?

2 个答案:

答案 0 :(得分:2)

您可以像这样简单地建立它们的列表:

<ul>
    <g:each var="c" in="${grailsApplication.controllerClasses.sort { it.fullName } }">
    <li><g:link controller="${c.logicalPropertyName}">${c.fullName}</g:link></li>
    </g:each>
</ul>

此代码取自默认index.gsp的旧Grails 1.3x项目。不知道它是否仍然可以在最新版本的Grails中使用,但是至少应该让您知道可以做什么,这是动态的。

更新 正如Jeff Scott Brown指出的那样,这将包括 ALL 控制器,无论是否安装了脚手架,以及那些由插件提供的控制器。从理论上讲,您可以进一步从grailsApplication.controllerClasses过滤结果类,检查它们的包(假设您的域在一个或多个已知包中)和/或是否被脚手架(static scaffold = true)。

答案 1 :(得分:2)

作为对约书亚(Joshua)答案的扩展,以下内容应该为您提供脚手架控制器的列表,至少应为grails 3。

<g:each var="c" in="${grailsApplication.controllerClasses.findAll{ it.isReadableProperty('scaffold') } }">
    <li><g:link controller="${c.logicalPropertyName}">${c.fullName}</g:link></li>
</g:each>

编辑

按照注释中的要求,要获取表名,您需要访问需要注入到控制器中的sessionFactory,类似以下内容将为您提供域名到域表名的映射。

控制器

class YourController {

    def sessionFactory

    def index() {
        def scaffoldedTables = grailsApplication.controllerClasses.findAll{ it.isReadableProperty( 'scaffold' ) }.collectEntries {
            [(it.name): sessionFactory.getClassMetadata(it.getPropertyValue( 'scaffold', Object.class )).tableName]
        }

        [scaffoldedTables: scaffoldedTables]
    }
}

gsp

<g:each var="c" in="${scaffoldedTables}">
    <li><g:link controller="${c.key}">${c.value}</g:link></li>
</g:each>