新規作成では正しい挙動が、編集では欠陥だった

編集ページで保存を押したら、フォームの中身が全部消えました。
バグなのですが、同じコードが新規作成のページでは2日前から問題なく動いていました。
消えること自体は、片方では正しい動きだったからです。

目次

症状

編集ページで保存を押すと、入力欄が全部空になります。
その状態でもう一度押すと、「タイトルを入力してください」と怒られます。
空になったフォームを、そのまま送信してしまうわけです。

原因の詳細は別に書くとして、ここでは経緯のほうを残します。
ざっくり言うと、送信のあとにフォームが初期化されていました。
サーバーには正しい値が届いていて、壊れていたのは送信の「あと」でした。

同じコードが、新規作成では正しかった

引っかかったのはここです。

追加フォームと編集フォームは、同じコードをコピーして作っていました。
まだ共通化していない段階です。
そして追加フォームのほうは、2日前から問題なく動いていました。

理由は考えれば当たり前で、新規作成では「送信後に空になる」のが正しい挙動だからです。
1件登録したら、次の1件を続けて入力できます。むしろ空になってほしい。

同じ振る舞いが、追加では機能で、編集では欠陥でした。
コードを見ても、どちらなのかは分かりません。
どちらの画面で使うかを決めて、はじめて正しいか欠陥かが決まる種類の挙動でした。

対策は先に書いてあった

さらに引っかかったのは、この問題への対策を手順書に先に書いてあったことです。
書き漏らしではありません。実際にコードにも入っていました。

ただ、その対策はサーバーがエラーを返したときにしか働きません。
入力に不備があって差し戻されたとき、入力済みの値を保つためのものでした。

保存が成功した場合は、サーバーは何も返しません。
返らないので、フォームに書き戻す値も変化しません。
結果、空のまま残ります。

「対策が足りなかった」というより、「対策が想定していた場面が片方だけだった」。
エラーで戻ってくる場面は想定していて、成功する場面は想定していませんでした。

直すのではなく、起きない形にした

直し方は2通りありました。

  • 問題を直す: 保存に成功したときも値を書き戻して、フォームを埋め直す
  • 起きない形にする: 保存に成功したら、一覧ページへ戻す

後者を選びました。
編集を終えたあと、編集画面に留まる理由がありません。
一覧へ戻せば、そもそも空のフォームを見せる場面が消えます。

前者も検討はしました。ただ、値の持ち方が二重になったり、
サーバーが返す情報の形が増えたりするので、今回の目的には重いと判断しました。

コピーで作ったこと自体は、悪くなかった

最後に1つ。
追加と編集を別々にコピーして作ったのは、判断としては間違っていなかったと思っています。
未知の要素を1つずつ潰すほうが速い、という実測が手元にあって、それに従いました。

ただ、共通化していたら、片方で見つけたバグが両方に効いていたのも事実です。
今回は逆で、片方で見つからなかったバグが、もう片方で出ました。
どちらが良いという話ではなく、別々に持つと発見も別々になるということだと思っています。

目次