我的Grails应用程序中有一堆模型类,所有这些模型类都是用于动态构建各自数据库表的目的。对于应用程序的索引,我想要一个包含所有这些脚手架的菜单,以便在添加新模型的情况下更新菜单。
是否有任何自动的Grails方法来执行此操作,或者我是否坚持为每个类静态地键入g:link
来创建天真的索引视图,以将用户带到各自的CRUD视图?
答案 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>