プロジェクト

全般

プロフィール

バグ #660

完了

フェーズ #620: Phase 9. 本番/インフラ/バグ

Story の default を管理画面の編集モーダルから設定しても反映されない

本間 紀史 さんが8日前に追加. 8日前に更新.

ステータス:
終了
優先度:
通常
担当者:
開始日:
2026/06/22
期日:
進捗率:

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日前に更新

  • ステータス新規 から 進行中 に変更

本間 紀史 さんが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.erbeditForm['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 はチェックボックス表示同期バグの修正として有効。マージ対象。

本間 紀史 さんが8日前に更新

  • ステータス進行中 から 終了 に変更

他の形式にエクスポート: Atom PDF