コミットを比較

..
5 コミット
作成者 SHA1 メッセージ 日付
Codex Night Worker c4a8076ade AI: address issue #445 2026-11-15 15:41:15 +09:00
みてるぞ f6ca2dd0c1 #445 2026-11-15 14:42:31 +09:00
みてるぞ ca3c78b220 Merge remote-tracking branch 'origin/main' into feature/445 2026-11-15 14:32:26 +09:00
みてるぞ 5f66dc8817 #445 2026-11-11 22:13:31 +09:00
みてるぞ 5840987162 #445 2026-11-09 00:02:32 +09:00
9個のファイルの変更、15行の追加、15行の削除
+1 -1
ファイルの表示
@@ -424,7 +424,7 @@ races according to the target constraint's business meaning.
and JSON keys are generally snake_case. and JSON keys are generally snake_case.
- Preserve existing HTTP status conventions: - Preserve existing HTTP status conventions:
`:unauthorized` for no user, `:forbidden` for insufficient role or banned `:unauthorized` for no user, `:forbidden` for insufficient role or banned
user, `:not_found` for missing records, and `:unprocessable_content` for user, `:not_found` for missing records, and `:unprocessable_entity` for
validation failures. validation failures.
- For diagnostic or internal helper JSON, prefer a deliberately light response - For diagnostic or internal helper JSON, prefer a deliberately light response
shape over full representation classes when callers only need identifiers, shape over full representation classes when callers only need identifiers,
+1 -1
ファイルの表示
@@ -95,7 +95,7 @@ class ApplicationController < ActionController::API
render_validation_error base: ['すでに存在してゐます.'] render_validation_error base: ['すでに存在してゐます.']
end end
def render_validation_error record = nil, fields: { }, base: [], status: :unprocessable_content def render_validation_error record = nil, fields: { }, base: [], status: :unprocessable_entity
errors = { } errors = { }
if record if record
+3 -3
ファイルの表示
@@ -18,7 +18,7 @@ class CountsExportsController < ApplicationController
render json: { error: 'private_condition' }, status: :forbidden render json: { error: 'private_condition' }, status: :forbidden
rescue CountsTableQuery::TooManyColumns rescue CountsTableQuery::TooManyColumns
render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS },
status: :unprocessable_content status: :unprocessable_entity
rescue ActiveRecord::StatementTimeout rescue ActiveRecord::StatementTimeout
render json: { error: 'counts_query_timeout' }, status: :service_unavailable render json: { error: 'counts_query_timeout' }, status: :service_unavailable
rescue ArgumentError, TypeError, KeyError, JSON::ParserError rescue ArgumentError, TypeError, KeyError, JSON::ParserError
@@ -63,7 +63,7 @@ class CountsExportsController < ApplicationController
render json: { error: 'private_condition' }, status: :forbidden render json: { error: 'private_condition' }, status: :forbidden
rescue CountsTableQuery::TooManyColumns rescue CountsTableQuery::TooManyColumns
render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS },
status: :unprocessable_content status: :unprocessable_entity
rescue ActiveRecord::StatementTimeout rescue ActiveRecord::StatementTimeout
render json: { error: 'counts_query_timeout' }, status: :service_unavailable render json: { error: 'counts_query_timeout' }, status: :service_unavailable
rescue ArgumentError, TypeError, KeyError, JSON::ParserError rescue ArgumentError, TypeError, KeyError, JSON::ParserError
@@ -107,7 +107,7 @@ class CountsExportsController < ApplicationController
render json: { error: 'private_condition' }, status: :forbidden render json: { error: 'private_condition' }, status: :forbidden
rescue CountsTableQuery::TooManyColumns rescue CountsTableQuery::TooManyColumns
render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS },
status: :unprocessable_content status: :unprocessable_entity
rescue ActiveRecord::StatementTimeout rescue ActiveRecord::StatementTimeout
render json: { error: 'counts_query_timeout' }, status: :service_unavailable render json: { error: 'counts_query_timeout' }, status: :service_unavailable
rescue ArgumentError, TypeError, KeyError, JSON::ParserError rescue ArgumentError, TypeError, KeyError, JSON::ParserError
+1 -1
ファイルの表示
@@ -24,7 +24,7 @@ class CountsTablesController < ApplicationController
render json: { error: 'private_condition' }, status: :forbidden render json: { error: 'private_condition' }, status: :forbidden
rescue CountsTableQuery::TooManyColumns rescue CountsTableQuery::TooManyColumns
render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS }, render json: { error: 'too_many_columns', max_columns: CountsTableQuery::MAX_COLUMNS },
status: :unprocessable_content status: :unprocessable_entity
rescue CountsPivotTotals::TimedOut rescue CountsPivotTotals::TimedOut
Rails.logger.warn('counts_query_timeout: pivot_totals') Rails.logger.warn('counts_query_timeout: pivot_totals')
render json: { error: 'counts_query_timeout', stage: 'totals', render json: { error: 'counts_query_timeout', stage: 'totals',
+2 -2
ファイルの表示
@@ -15,7 +15,7 @@ class GekanatorGamesController < ApplicationController
answers:) answers:)
if game.invalid? if game.invalid?
render json: { errors: game.errors.full_messages }, status: :unprocessable_content render json: { errors: game.errors.full_messages }, status: :unprocessable_entity
return return
end end
@@ -31,7 +31,7 @@ class GekanatorGamesController < ApplicationController
learned_example_count: learned_example_count:
}, status: :created }, status: :created
rescue ActiveRecord::RecordInvalid => e rescue ActiveRecord::RecordInvalid => e
render json: { errors: e.record.errors.full_messages }, status: :unprocessable_content render json: { errors: e.record.errors.full_messages }, status: :unprocessable_entity
end end
def extra_questions def extra_questions
+1 -1
ファイルの表示
@@ -536,7 +536,7 @@ class MaterialsController < ApplicationController
errors: { }, errors: { },
base_errors: ['ZIP export に必要な素材ファイルが欠損しています.'], base_errors: ['ZIP export に必要な素材ファイルが欠損しています.'],
missing_files: }, missing_files: },
status: :unprocessable_content status: :unprocessable_entity
end end
def build_uploaded_material_blob! file, file_sha256 def build_uploaded_material_blob! file, file_sha256
+2 -2
ファイルの表示
@@ -429,7 +429,7 @@ class PostsController < ApplicationController
filters = literals.map do |literal| filters = literals.map do |literal|
internal, = source_ids.fetch(literal[:name]) internal, = source_ids.fetch(literal[:name])
name = internal.empty? ? literal[:name] : names[internal.first] name = internal.empty? ? literal[:name] : names[internal.first]
return head :unprocessable_content unless name && internal.length <= 1 return head :unprocessable_entity unless name && internal.length <= 1
literal[:negative] ? "not:#{ name }" : name literal[:negative] ? "not:#{ name }" : name
end end
@@ -438,7 +438,7 @@ class PostsController < ApplicationController
literals.zip(translated).each do |literal, translation| literals.zip(translated).each do |literal, translation|
unless (source_ids.fetch(literal[:name]).map(&:sort) == unless (source_ids.fetch(literal[:name]).map(&:sort) ==
target_ids.fetch(translation[:name]).map(&:sort)) target_ids.fetch(translation[:name]).map(&:sort))
return head :unprocessable_content return head :unprocessable_entity
end end
end end
index = 0 index = 0
+2 -2
ファイルの表示
@@ -55,7 +55,7 @@ class TheatresController < ApplicationController
theatre = Theatre.find_by(id: params[:id]) theatre = Theatre.find_by(id: params[:id])
return head :not_found unless theatre return head :not_found unless theatre
requested_post_id = params[:post_id].to_i requested_post_id = params[:post_id].to_i
return head :unprocessable_content if requested_post_id <= 0 return head :unprocessable_entity if requested_post_id <= 0
skipped = false skipped = false
conflicted = false conflicted = false
@@ -95,7 +95,7 @@ class TheatresController < ApplicationController
theatre = Theatre.find_by(id: params[:id]) theatre = Theatre.find_by(id: params[:id])
return head :not_found unless theatre return head :not_found unless theatre
requested_post_id = params[:post_id].to_i requested_post_id = params[:post_id].to_i
return head :unprocessable_content if requested_post_id <= 0 return head :unprocessable_entity if requested_post_id <= 0
conflicted = false conflicted = false
+2 -2
ファイルの表示
@@ -20,7 +20,7 @@ RSpec.describe 'error responses', type: :request do
patch "/tags/#{ tag.id }", params: { category: 'nico' } patch "/tags/#{ tag.id }", params: { category: 'nico' }
expect(response).to have_http_status(:unprocessable_content) expect(response).to have_http_status(:unprocessable_entity)
expect(json).to include( expect(json).to include(
'type' => 'validation_error', 'type' => 'validation_error',
'message' => '入力内容を確認してください.', 'message' => '入力内容を確認してください.',
@@ -37,7 +37,7 @@ RSpec.describe 'error responses', type: :request do
put "/users/#{ user.id }", params: { name: 'a' * 256 } put "/users/#{ user.id }", params: { name: 'a' * 256 }
expect(response).to have_http_status(:unprocessable_content) expect(response).to have_http_status(:unprocessable_entity)
expect(json).to include( expect(json).to include(
'type' => 'validation_error', 'type' => 'validation_error',
'message' => '入力内容を確認してください.') 'message' => '入力内容を確認してください.')