使用mysql数据源的Grails应用程序不存储复选框位值

时间:2012-10-29 23:28:50

标签: mysql

在我的Grails应用程序中,我有两个域类... Person和Course。两者之间存在一对多的关系(一个课程可以有多个人注册)。因此,默认的脚手架将显示show.gsp中课程中注册的所有人员的列表。

我修改了show.gsp以添加“付费”和“有人值守”复选框:

<g:if test="${courseInstance?.persons}">
            <br />
            <table>
                <thead>
                    <tr>
                        <th>#</th>
                        <g:sortableColumn property="person"
                            title="${message(code: 'person.lastName.label', default: 'Person')}" />
                        <g:sortableColumn property="paid"
                            title="${message(code: 'person.paid.label', default: 'Paid')}" />
                        <g:sortableColumn property="attended"
                            title="${message(code: 'person.paid.attended', default: 'Attended')}" />
                    </tr>
                </thead>
                <tbody>
                    <g:set var="counter" value="${1}" />
                    <g:each in="${courseInstance.persons}" status="i" var="p">
                        <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
                            <td>
                                ${counter}
                            </td>
                            <td class="property-value" aria-labelledby="persons-label"><g:link
                                    controller="person" action="show" id="${p.id}">
                                    ${p?.encodeAsHTML()}
                                </g:link></td>
                            <td><g:checkBox name="paid" value="${p.paid}"
                                    onclick="${remoteFunction(action:'togglePaid', id:p.id,
                                params:'\'completed=\' + this.checked')}" /></td>
                            <td><g:checkBox name="attended" value="${p.attended}"
                                    onclick="${remoteFunction(action:'toggleAttended', id:p.id,
                                params:'\'completed=\' + this.checked')}" /></td>
                        </tr>
                        <g:set var="counter" value="${counter + 1}" />
                    </g:each>
                </tbody>
            </table>
        </g:if>

在班级管理员中我添加了:

class CourseController {

static scaffold = true

def toggleAttended = {
    def person = Person.get(params.id)
    if (person){
        person.attended = params.completed == 'true'
        person.save()
    }
    render ''
}

def togglePaid = {
    def person = Person.get(params.id)
    if (person){
        person.paid = params.completed == 'true'
        person.save()
    }
    render ''
}

}

当我选中/取消选中复选框时,会成功记住这些值。但是我注意到我的MySQL数据库没有存储这三个复选框的任何值,无论它们是被选中还是未选中:

mysql> SELECT paid, attended, pfa FROM person;
+------+----------+-----+
| paid | attended | pfa |
+------+----------+-----+
|      |          |     |
+------+----------+-----+
1 row in set (0.00 sec)

列的类型为“bit”。我想知道如果数据库中没有存储任何值,如何记住这些值。另外,我是否需要在控制器中添加额外的代码来更新数据库中的值?或者这应该自动发生?

谢谢!

1 个答案:

答案 0 :(得分:1)

将您的选择更改为SELECT paid + 0,参加+ 0,pfa + 0 FROM person;看看你是否能看到这些价值观。 mysql客户端无法呈现位值。这是一个非常老的错误。

关于此,你无法在grails中做任何事情。这是mysql命令行客户端的限制。它与您的应用程序无关。您需要使用该语法的唯一时间是使用mysql命令行客户端。

bugs.mysql.com/bug.php?id=28422