保存前にタイトルを正規化する
タイトルの前後にある空白を保存前に取り除き、保存する値をコードで統一します。ブラウザ側で送信前に整える例と同じ Title を対象にして、処理を置く場所と反映先の違いを説明します。
この手順とコードは本体ソースで確認しています。実機での動作確認結果ではありません。
適用条件
- 検証用の記録テーブルまたは期限付きテーブル。
- テーブルを管理でき、タイトル項目の作成・更新ができるユーザー。
- タイトルを変更してよい検証用レコード。
model は、処理対象のレコードから組み立てたオブジェクトです。model.Title はブラウザの入力要素ではありません。読める項目と変更を反映できる項目には権限の判定があります(読み取り判定、編集可能項目の抽出)。
実装コード
実行条件は「作成前」と「更新前」、共有はオフにします。画面表示の条件へ置くと、同じ代入でも保存への反映が変わります。
if (model.Title !== null && model.Title !== undefined) {
model.Title = String(model.Title).trim();
}「作成前」は BeforeCreate、「更新前」は BeforeUpdate に対応します。条件名と context.Condition の対応は context.Conditionで確認できます。
送信値と保存値を比較する
- 検証用レコードの編集画面を開く。
- タイトルを「動作確認」にし、その前後に半角空白を2つずつ入れる。
- 更新ボタンを押す。
- 更新結果を確認する。
- 画面を再読み込みし、タイトルが
動作確認になっていることを確認する。
ブラウザ側の空白除去処理は外して比較します。空白入りの値を送る確認では、通常のタイトル入力欄がある画面で、コンソールから次のコードを実行してから更新します。
(function () {
const $title = $p.getControl('Title');
if (!$title || $title.length !== 1 || !$title.is('input[type="text"]')) {
console.warn('タイトルの入力欄が見つかりません。');
return;
}
$p.set($title, ' 動作確認 ');
})();これはブラウザのコンソールで実行するコードです。サーバースクリプトの欄には入れません。ネットワーク表示の更新リクエストで空白入りの値を確認し、再読み込み後の保存値と比較します。
新規作成でも同じ確認を行います。新規画面を開くだけでは「作成前」は呼ばれず、作成ボタンから保存処理へ進むと呼ばれます(作成処理と保存前フック)。
保存へ反映される仕組み
図を読み込み中…
model.Title の代入は、まず処理中のレコードモデルに戻されます。この例では作成・更新の前に動くため、後続の通常の保存処理が変更後の値を使います(変更値の反映、課題の作成前フック、課題の更新前フック)。
更新前は標準検証より前ではない
記録テーブルの通常の更新では、入力反映・計算式・標準の更新時検証を経て、更新前スクリプトが実行されます。この例は空白を除く方法を説明するもので、必須検証を置き換えるものではありません。操作別の実行順も確認してください。
実行条件を変えると結果も変わる
| 条件 | 対象や実行位置 | この例で確認すべきこと |
|---|---|---|
| 作成前 | 作成するレコードの保存前 | 作成値に空白除去が反映されるか |
| 更新前 | 更新するレコードの保存前 | 更新値に空白除去が反映されるか |
| 行表示の前 | 一覧に表示する対象行 | 代入だけでは DB 更新にならない |
| 画面表示の前 | 画面を作る前。対象は呼び出し元によって異なる | 一覧の各行と編集対象を混同していないか |
行表示の前へ移して一覧が変わっても、保存値が変わった証拠にはなりません。対象と保存処理の違いは model の内部構造と反映条件で説明しています。
次に読むページ
- 操作別に見る実行順 — 保存・表示・自動ポストバックの違い。
- context.Condition と context.Action — 実行条件と操作の区別。
- model の内部構造と反映条件 — 値の型と権限、保存との関係。
- サーバースクリプトの内部構造 — 結合、共有、関数化、例外処理。
- 動かない・値が反映されないときの調べ方 — 期待する結果が出ない場合の確認順。