From d6fc57a00ec141f395f6b4bc410e9359b220e0c4 Mon Sep 17 00:00:00 2001 From: Codex Night Worker Date: Mon, 16 Nov 2026 00:18:56 +0900 Subject: [PATCH] AI: address issue #479 --- backend/AGENTS.md | 2 +- backend/app/controllers/application_controller.rb | 2 +- backend/app/controllers/counts_exports_controller.rb | 6 +++--- backend/app/controllers/counts_tables_controller.rb | 2 +- backend/app/controllers/gekanator_games_controller.rb | 4 ++-- backend/app/controllers/materials_controller.rb | 2 +- backend/app/controllers/posts_controller.rb | 4 ++-- backend/app/controllers/theatres_controller.rb | 4 ++-- backend/spec/requests/error_responses_spec.rb | 4 ++-- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/backend/AGENTS.md b/backend/AGENTS.md index e476fbd..cedf8f3 100644 --- a/backend/AGENTS.md +++ b/backend/AGENTS.md @@ -424,7 +424,7 @@ races according to the target constraint's business meaning. and JSON keys are generally snake_case. - Preserve existing HTTP status conventions: `:unauthorized` for no user, `:forbidden` for insufficient role or banned - user, `:not_found` for missing records, and `:unprocessable_entity` for + user, `:not_found` for missing records, and `:unprocessable_content` for validation failures. - For diagnostic or internal helper JSON, prefer a deliberately light response shape over full representation classes when callers only need identifiers, diff --git a/backend/app/controllers/application_controller.rb b/backend/app/controllers/application_controller.rb index 3e9305a..38b3fe2 100644 --- a/backend/app/controllers/application_controller.rb +++ b/backend/app/controllers/application_controller.rb @@ -95,7 +95,7 @@ class ApplicationController < ActionController::API render_validation_error base: ['すでに存在してゐます.'] end - def render_validation_error record = nil, fields: { }, base: [], status: :unprocessable_entity + def render_validation_error record = nil, fields: { }, base: [], status: :unprocessable_content errors = { } if record diff --git a/backend/app/controllers/counts_exports_controller.rb b/backend/app/controllers/counts_exports_controller.rb index dff8f05..6bb15fb 100644 --- a/backend/app/controllers/counts_exports_controller.rb +++ b/backend/app/controllers/counts_exports_controller.rb @@ -18,7 +18,7 @@ class CountsExportsController < ApplicationController render json: { error: 'private_condition' }, status: :forbidden rescue CountsTableQuery::TooManyColumns render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, - status: :unprocessable_entity + status: :unprocessable_content rescue ActiveRecord::StatementTimeout render json: { error: 'counts_query_timeout' }, status: :service_unavailable rescue ArgumentError, TypeError, KeyError, JSON::ParserError @@ -63,7 +63,7 @@ class CountsExportsController < ApplicationController render json: { error: 'private_condition' }, status: :forbidden rescue CountsTableQuery::TooManyColumns render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, - status: :unprocessable_entity + status: :unprocessable_content rescue ActiveRecord::StatementTimeout render json: { error: 'counts_query_timeout' }, status: :service_unavailable rescue ArgumentError, TypeError, KeyError, JSON::ParserError @@ -107,7 +107,7 @@ class CountsExportsController < ApplicationController render json: { error: 'private_condition' }, status: :forbidden rescue CountsTableQuery::TooManyColumns render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, - status: :unprocessable_entity + status: :unprocessable_content rescue ActiveRecord::StatementTimeout render json: { error: 'counts_query_timeout' }, status: :service_unavailable rescue ArgumentError, TypeError, KeyError, JSON::ParserError diff --git a/backend/app/controllers/counts_tables_controller.rb b/backend/app/controllers/counts_tables_controller.rb index 6a6f5bb..df30e97 100644 --- a/backend/app/controllers/counts_tables_controller.rb +++ b/backend/app/controllers/counts_tables_controller.rb @@ -24,7 +24,7 @@ class CountsTablesController < ApplicationController render json: { error: 'private_condition' }, status: :forbidden rescue CountsTableQuery::TooManyColumns render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, - status: :unprocessable_entity + status: :unprocessable_content rescue CountsPivotTotals::TimedOut Rails.logger.warn('counts_query_timeout: pivot_totals') render json: { error: 'counts_query_timeout', stage: 'totals', diff --git a/backend/app/controllers/gekanator_games_controller.rb b/backend/app/controllers/gekanator_games_controller.rb index ad3aebf..0f887c8 100644 --- a/backend/app/controllers/gekanator_games_controller.rb +++ b/backend/app/controllers/gekanator_games_controller.rb @@ -15,7 +15,7 @@ class GekanatorGamesController < ApplicationController answers:) if game.invalid? - render json: { errors: game.errors.full_messages }, status: :unprocessable_entity + render json: { errors: game.errors.full_messages }, status: :unprocessable_content return end @@ -31,7 +31,7 @@ class GekanatorGamesController < ApplicationController learned_example_count: }, status: :created rescue ActiveRecord::RecordInvalid => e - render json: { errors: e.record.errors.full_messages }, status: :unprocessable_entity + render json: { errors: e.record.errors.full_messages }, status: :unprocessable_content end def extra_questions diff --git a/backend/app/controllers/materials_controller.rb b/backend/app/controllers/materials_controller.rb index 93b2fbe..3f2440d 100644 --- a/backend/app/controllers/materials_controller.rb +++ b/backend/app/controllers/materials_controller.rb @@ -536,7 +536,7 @@ class MaterialsController < ApplicationController errors: { }, base_errors: ['ZIP export に必要な素材ファイルが欠損しています.'], missing_files: }, - status: :unprocessable_entity + status: :unprocessable_content end def build_uploaded_material_blob! file, file_sha256 diff --git a/backend/app/controllers/posts_controller.rb b/backend/app/controllers/posts_controller.rb index ba15e99..d721046 100644 --- a/backend/app/controllers/posts_controller.rb +++ b/backend/app/controllers/posts_controller.rb @@ -429,7 +429,7 @@ class PostsController < ApplicationController filters = literals.map do |literal| internal, = source_ids.fetch(literal[:name]) name = internal.empty? ? literal[:name] : names[internal.first] - return head :unprocessable_entity unless name && internal.length <= 1 + return head :unprocessable_content unless name && internal.length <= 1 literal[:negative] ? "not:#{ name }" : name end @@ -438,7 +438,7 @@ class PostsController < ApplicationController literals.zip(translated).each do |literal, translation| unless (source_ids.fetch(literal[:name]).map(&:sort) == target_ids.fetch(translation[:name]).map(&:sort)) - return head :unprocessable_entity + return head :unprocessable_content end end index = 0 diff --git a/backend/app/controllers/theatres_controller.rb b/backend/app/controllers/theatres_controller.rb index 10f4455..a289739 100644 --- a/backend/app/controllers/theatres_controller.rb +++ b/backend/app/controllers/theatres_controller.rb @@ -55,7 +55,7 @@ class TheatresController < ApplicationController theatre = Theatre.find_by(id: params[:id]) return head :not_found unless theatre requested_post_id = params[:post_id].to_i - return head :unprocessable_entity if requested_post_id <= 0 + return head :unprocessable_content if requested_post_id <= 0 skipped = false conflicted = false @@ -95,7 +95,7 @@ class TheatresController < ApplicationController theatre = Theatre.find_by(id: params[:id]) return head :not_found unless theatre requested_post_id = params[:post_id].to_i - return head :unprocessable_entity if requested_post_id <= 0 + return head :unprocessable_content if requested_post_id <= 0 conflicted = false diff --git a/backend/spec/requests/error_responses_spec.rb b/backend/spec/requests/error_responses_spec.rb index 81c3ab9..1482dcb 100644 --- a/backend/spec/requests/error_responses_spec.rb +++ b/backend/spec/requests/error_responses_spec.rb @@ -20,7 +20,7 @@ RSpec.describe 'error responses', type: :request do patch "/tags/#{ tag.id }", params: { category: 'nico' } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json).to include( 'type' => 'validation_error', 'message' => '入力内容を確認してください.', @@ -37,7 +37,7 @@ RSpec.describe 'error responses', type: :request do put "/users/#{ user.id }", params: { name: 'a' * 256 } - expect(response).to have_http_status(:unprocessable_entity) + expect(response).to have_http_status(:unprocessable_content) expect(json).to include( 'type' => 'validation_error', 'message' => '入力内容を確認してください.')