前の工程で書いた1行が、次の工程で動作を止めていました。
書いた当時は正しくて、間違いを直したわけでもありません。
置かれた場所が変わったので、正しさの向きが変わった、という話です。
前の工程では、正しかった
カードを並び替える ↑↓ のボタンは、見た目だけ先に作りました。
中身がまだ無いので、押しても何も起きません。
そのとき、送信を起こさない指定を付けました。
フォームの中にあるボタンは、既定では押すと送信が起きます。
まだ中身が無いのに送信されると困るので、起こさないようにする。
当時の書き方としては正しくて、意図の表明にもなっていました。
次の工程で、動かなくなった
翌日、そのボタンを実際に動くようにしました。
フォームで包んで、押したらサーバー側の処理が呼ばれる形にしました。
押しても、何も起きません。
無反応でした。
原因は、前に付けた「送信を起こさない指定」が残っていたことでした。
フォームは正しく組んであるのに、そのボタンだけが送信を起こしません。
当時の正しさが、そのまま障害になっていました。
同じ症状が3回、原因は毎回違った
この「押しても何も起きない」は、2日で3回目でした。
| 症状 | 原因 | |
|---|---|---|
| 1回目 | 保存を押しても何も起きない | 実装側の不具合 |
| 2回目 | 保存を押しても何も起きない | クリックが送信を起こしていなかった |
| 3回目 | ↑↓ を押しても何も起きない | 送信を起こさない指定が残っていた |
3回とも見え方は同じです。
ボタンを押して、画面が変わらない。
原因の層は、実装・操作・過去の自分の意図と、毎回違いました。
「押しても何も起きない」は症状であって、原因ではありませんでした。
2回経験しても、3回目の原因は当てられませんでした。
毎回別でした。
そもそもなぜフォームなのか
ついでに書いておくと、クリックの処理を書くのではなくフォームにしたのには理由があります。
| 必要なもの | JavaScript が無効なら | |
|---|---|---|
| クリックの処理 | ブラウザ側で動くコード | 動かない |
| フォーム | なし | 動く |
このファイルは、ブラウザに JavaScript を1バイトも送っていません。
サーバー側で組み立てて返すだけの作りです。
だからフォームである以上、送信を起こせるのは送信ボタンだけ、という単純な話でした。
前の工程の指定が残っていると、そのボタンは送信ボタンではなくなります。
仕様どおりに動いていただけでした。
バグではありません。
前の自分を疑うときは、前提の変化を探す
持ち帰ったのは、過去に書いたものの見方です。
前の自分が書いたものが動かないとき、つい間違い探しをします。
今回は、間違いは1つもありませんでした。
ゼロです。
変わったのは前提のほうで、ボタンがフォームの中に入ったことでした。
属性は動作の指定であると同時に、そのときの意図の表明でもあります。
意図が変わったら、見直す対象になる。
「間違っているところを探す」より「前提が変わったところを探す」ほうが、今回は早い道でした。
