編集ページで保存を押したら、フォームの中身が全部消えました。
バグなのですが、同じコードが新規作成のページでは2日前から問題なく動いていました。
消えること自体は、片方では正しい動きだったからです。
症状
編集ページで保存を押すと、入力欄が全部空になります。
その状態でもう一度押すと、「タイトルを入力してください」と怒られます。
空になったフォームを、そのまま送信してしまうわけです。
原因の詳細は別に書くとして、ここでは経緯のほうを残します。
ざっくり言うと、送信のあとにフォームが初期化されていました。
サーバーには正しい値が届いていて、壊れていたのは送信の「あと」でした。
同じコードが、新規作成では正しかった
引っかかったのはここです。
追加フォームと編集フォームは、同じコードをコピーして作っていました。
まだ共通化していない段階です。
そして追加フォームのほうは、2日前から問題なく動いていました。
理由は考えれば当たり前で、新規作成では「送信後に空になる」のが正しい挙動だからです。
1件登録したら、次の1件を続けて入力できます。むしろ空になってほしい。
同じ振る舞いが、追加では機能で、編集では欠陥でした。
コードを見ても、どちらなのかは分かりません。
どちらの画面で使うかを決めて、はじめて正しいか欠陥かが決まる種類の挙動でした。
対策は先に書いてあった
さらに引っかかったのは、この問題への対策を手順書に先に書いてあったことです。
書き漏らしではありません。実際にコードにも入っていました。
ただ、その対策はサーバーがエラーを返したときにしか働きません。
入力に不備があって差し戻されたとき、入力済みの値を保つためのものでした。
保存が成功した場合は、サーバーは何も返しません。
返らないので、フォームに書き戻す値も変化しません。
結果、空のまま残ります。
「対策が足りなかった」というより、「対策が想定していた場面が片方だけだった」。
エラーで戻ってくる場面は想定していて、成功する場面は想定していませんでした。
直すのではなく、起きない形にした
直し方は2通りありました。
- 問題を直す: 保存に成功したときも値を書き戻して、フォームを埋め直す
- 起きない形にする: 保存に成功したら、一覧ページへ戻す
後者を選びました。
編集を終えたあと、編集画面に留まる理由がありません。
一覧へ戻せば、そもそも空のフォームを見せる場面が消えます。
前者も検討はしました。ただ、値の持ち方が二重になったり、
サーバーが返す情報の形が増えたりするので、今回の目的には重いと判断しました。
コピーで作ったこと自体は、悪くなかった
最後に1つ。
追加と編集を別々にコピーして作ったのは、判断としては間違っていなかったと思っています。
未知の要素を1つずつ潰すほうが速い、という実測が手元にあって、それに従いました。
ただ、共通化していたら、片方で見つけたバグが両方に効いていたのも事実です。
今回は逆で、片方で見つからなかったバグが、もう片方で出ました。
どちらが良いという話ではなく、別々に持つと発見も別々になるということだと思っています。
