繁体   English   中英

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

[英]Dynamically creating a menu of available scaffoldings in Grails

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

是否有任何自动的Grails方式做到这一点,或者我坚持为每个类静态地键入一堆g:link来创建一个幼稚的索引视图,以将用户带到各自的CRUD视图?

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

<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的最新版本中使用,但是它至少应该使您知道可以做什么,这是动态的。

UPDATE杰夫斯科特·布朗指出,这将包括所有的控制器,脚手架与否,以及那些插件来提供。 从理论上讲,您可以从grailsApplication.controllerClasses进一步过滤生成的类,检查它们的包(假设您的域在一个或多个已知包中)和/或是否被脚手架( static scaffold = true )。

作为对约书亚答案的扩展,以下内容应为您提供脚手架控制器的列表,至少应为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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM