当第一个字段可为空时,列表支架视图中没有编辑链接

时间:2014-08-06 19:41:33

标签: grails gsp grails-2.4

假设我有一个Domain Class(让我们称之为Person),它具有各种String属性,如下所示:

class Person {
    String favoriteColor
    String favoriteAnimal       

    static constraints = {
        favoriteColor(nullable: true)

        favoriteAnimal(nullable: true)           
    }
}

我现在只想使用动态脚手架,看看我能用这种快速的应用程序开发能力带我走多远......我已经听过这么多......但是这个课程就停在这里了。 / p>

问题

Screenshot of the un-editable item

问题是Grails动态脚手架中的默认行为是索引页面将显示第一个X条目数量,每个条目的第一个字段变成一个超级链接,允许您查看/编辑该特定条目项目

这真的很棒,但遗憾的是,当第一个字段可以为null时,索引页面会列出该条目 - 但没有点击链接可以详细查看/编辑该项目。

当然,简单的解决方案是将非可空字段设为第一项......但现在我有一个类,其中所有单个字段都可以为null,并使用自定义验证来确保至少一个字段包含一些东西因此,在这个烦人的边缘情况下不会工作(但这是一个业务需求,我无法保证在这里永远不会为空的单个字段。)

Grails解决这个问题的方法是什么,而不是完全抛弃脚手架?

如果我只需要改变这个控制器的索引功能来解决问题,我想用最少的代码来做这件事,而不必为控制器的其余部分抛弃动态脚手架。我非常喜欢脚手架(和Grails)的快速原型能力,并且想要充分利用这个功能集。

解决方案

使用Dónal's answer suggesting install-templates,我只需运行grails install-templates命令,然后转到我的项目src-> templates-> scaffolding-> index.gsp文件。虽然它充满了小脚本,这使得理解起来有些棘手,但解决方案非常容易。

在表格部分的html中,有一些类似的代码:

<table>
    <thead>
        <tr>                        
        <%  excludedProps = Event.allEvents.toList() << 'id' << 'version'
        ...

只需将其更改为以下内容,您就可以获得编辑功能的额外标题行:

<table>
    <thead>
        <tr>
            <th>&nbsp;</th>
            <%  excludedProps = Event.allEvents.toList() << 'id' << 'version'
            ...

然后降低你的代码,如:

<g:each in="\${${propertyName}List}" status="i" var="${propertyName}">
    <tr class="\${(i % 2) == 0 ? 'even' : 'odd'}">
    <%  props.eachWithIndex { p, i ->
        if (i == 0) { %>                            
        <td><g:link action="show" id="\${${propertyName}.id}">\${fieldValue(bean: ${propertyName}, field: "${p.name}")}</g:link></td>

通过简单的更改来删除第一个属性名称列上的链接,并将您自己的编辑链接添加到第一列,问题得到解决:

<g:each in="\${${propertyName}List}" status="i" var="${propertyName}">
    <tr class="\${(i % 2) == 0 ? 'even' : 'odd'}">
    <%  props.eachWithIndex { p, i ->
    if (i == 0) { %>
        <td><g:link action="show" id="\${${propertyName}.id}">Edit</g:link></td>
        <td>\${fieldValue(bean: ${propertyName}, field: "${p.name}")}</td>

因此,更改了一行并将两行添加到单个文件中(在Grails命令之后),您已更改默认的脚手架行为以适合您的喜好并支持可空字段。问题解决了!

1 个答案:

答案 0 :(得分:2)

  

Grails解决这个问题的方法是什么,而不是完全抛弃脚手架?

可以修改用于生成脚手架视图的模板。在修改它们之前,必须先运行install-templates命令。安装模板后,修改生成列表视图的模板,以便向每行添加视图链接(或按钮),而不是链接特定属性的值。然后,无论哪些属性为null,您始终都能够查看域实例。