要約
モデレーターがレビューキュー (/review) で保留中の投稿のタグを編集してから 承認 をクリックすると、承認リクエストが 500 内部サーバーエラー で失敗します。
再現手順
- 投稿がレビューキューで待機していることを確認します(例:承認が必要なユーザー/グループからの投稿)。
/reviewに移動します。- キューに入っている項目を開きます。
- タグセレクターUIを使用してタグを編集します。
- 承認 をクリックします。
- 500 の応答が発生することを確認します。
期待される動作
投稿が正常に承認され、更新されたタグが適用されること。
実際の動作
承認が 500 エラーで失敗します。
リクエストパターンの例:
PUT /review/{id}/perform/approve_post?version={x} → 500 (Internal Server Error)
何が起こっていると思われるか(根本原因)
レビューUIでタグを編集した後、レビュー可能ペイロードはタグ名文字列の代わりに完全なタグオブジェクトを格納します。
タグ編集前:
payload["tags"] = ["tag-one", "tag-two"]
/review でタグ編集後:
payload["tags"] = [
{"id"=>123, "name"=>"tag-one", "description"=>nil, "count"=>50, ...},
{"id"=>456, "name"=>"tag-two", "description"=>nil, "count"=>30, ...}
]
承認アクションがタグを処理する際、文字列を期待しているにもかかわらずハッシュ/オブジェクトを受け取るため、500エラーが発生しているようです。
回避策
タグを名前に戻すように正規化します。
r = ReviewableQueuedPost.find(ID)
r.payload["tags"] = r.payload["tags"].map { |t| t.is_a?(Hash) ? t["name"] : t }
r.save!
