バグ #660
完了フェーズ #620: Phase 9. 本番/インフラ/バグ
Story の default を管理画面の編集モーダルから設定しても反映されない
0%
説明
症状¶
管理画面の Story 編集モーダルで「default」チェックボックスを設定して保存しても、保存後に編集モーダルを再度開くとチェック状態が反映されない(実態と表示が食い違う)。
根本原因¶
app/views/admin/stories/index.html.erb L132 の
editForm['story[default]'].checked = story.default
f.check_box :default(_form_fields.html.erb L8)は同名 name="story[default]" の input を 2 つ(hidden value=0 と checkbox value=1)出力する。そのため editForm['story[default]'] は単一要素ではなく RadioNodeList を返し、.checked への代入は黙って無効化される(編集フォームの初期描画は @story = Story.new のため常に未チェック)。
結果、編集モーダルを開いてもチェック状態が同期されず、既存 default を編集すると意図せず default が外れる/反映されないように見える。
修正方針¶
チェックボックス本体を確実に取得して .checked をセットする。
editForm.querySelector('input[type="checkbox"][name="story[default]"]').checked = story.default
備考¶
モデル(Story#ensure_single_default)・コントローラ・strong parameters・スキーマは正常。バグはフロントエンド(編集モーダル JS)に局在。
本間 紀史 さんが8日前に更新
修正 PR を作成しました: https://github.com/init6/okinawan_eats/pull/71
ブランチ task/660(develop から分岐)。マージ=完了。
本間 紀史 さんが8日前に更新
調査の結果、症状は2つの別々の要因の合成でした。
1. チェックボックスの表示同期バグ(コード修正あり・PR #71)¶
編集モーダルを開いたとき、保存済みの default 状態がチェックボックスに反映されない。
- 原因:
f.check_box :defaultは同名name="story[default]"の input を hidden+checkbox の2つ出力するため、index.html.erbのeditForm['story[default]']が RadioNodeList を返し、.checked代入が無効化されていた。 - 修正:
editForm.querySelector('input[type="checkbox"][name="story[default]"]').checked = story.defaultでチェックボックス本体を取得。
2. 保存しても DB が変わらない(コード修正なし・開発サーバーのステール)¶
「チェックを変えて保存しても DB が変わらない(default が UPDATE 文に含まれない)」症状は、稼働中の開発サーバー(Puma)が古いモデルコードを保持していたことが原因。
- 検証: 同一コードでも (a)
rails runner単体、(b) 統合テスト(新規プロセスでのフルリクエスト)では default は正しく保存される。一方、長時間稼働中の Puma のみ default が UPDATE から欠落していた。 - 決定打: モデル(story.rb)を一度編集してクラスを再ロードさせた直後から、実 HTTP 経由の保存でも default が正しく永続化されるようになった(before_save/after_save のログで default の変更がDBに反映されることを確認)。
- 背景: 開発環境で View(.erb) の変更は毎回再描画されるが、クラスリローダ(.rb)はトリガーされないため、View 修正は反映されてもモデルは古いままになり得る。
結論・対応¶
- ディスク上の現行コード(モデル・コントローラ・
ensure_single_default)は正しい。本番(eager_load)では1回ロードのため発生しない。 - 開発サーバーは
bin/devを再起動すれば解消(ブランチ切替/pull 後は再起動推奨)。 - PR #71 はチェックボックス表示同期バグの修正として有効。マージ対象。