[英]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.