0

私の Grails アプリケーションには、Person と Course という 2 つのドメイン クラスがあります。この 2 つの間には 1 対多の関係があります (コースには複数の人が登録できます)。その結果、デフォルトのスキャフォールディングにより、コースに登録されているすべての人物のリストが 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 データベースには、これらの 3 つのチェックボックスがチェックされているかどうかに関係なく、値が保存されていないことに気付きました。

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

列のタイプは「ビット」です。データベースに何も保存されていない場合、値がどのように記憶されているのか疑問に思っています。また、データベースの値を更新するために、コントローラーにコードを追加する必要がありますか? それとも、これは自動的に行われるべきですか?

ありがとう!

4

1 に答える 1

1

SELECT を SELECT 有料 +0、出席 +0、PFA+0 FROM 人に変更します。値が表示されるかどうかを確認します。mysql クライアントはビット値をレンダリングできません。とても古いバグです。

これについてgrailsでできることは何もありません。これは、mysql コマンド ライン クライアントの制限です。あなたのアプリケーションとは何の関係もありません。この構文を使用する必要があるのは、mysql コマンド ライン クライアントを使用する場合のみです。

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

于 2012-10-30T00:24:47.837 に答える