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