コミットを比較
2
コミット
| 作成者 | SHA1 | 日付 | |
|---|---|---|---|
|
|
d6fc57a00e | ||
|
|
dda3d87073 |
+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_entity` for
|
user, `:not_found` for missing records, and `:unprocessable_content` 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,
|
||||||
|
|||||||
@@ -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_entity
|
def render_validation_error record = nil, fields: { }, base: [], status: :unprocessable_content
|
||||||
errors = { }
|
errors = { }
|
||||||
|
|
||||||
if record
|
if record
|
||||||
|
|||||||
@@ -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_entity
|
status: :unprocessable_content
|
||||||
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_entity
|
status: :unprocessable_content
|
||||||
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_entity
|
status: :unprocessable_content
|
||||||
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
|
||||||
|
|||||||
@@ -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_entity
|
status: :unprocessable_content
|
||||||
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',
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class GekanatorGamesController < ApplicationController
|
|||||||
answers:)
|
answers:)
|
||||||
|
|
||||||
if game.invalid?
|
if game.invalid?
|
||||||
render json: { errors: game.errors.full_messages }, status: :unprocessable_entity
|
render json: { errors: game.errors.full_messages }, status: :unprocessable_content
|
||||||
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_entity
|
render json: { errors: e.record.errors.full_messages }, status: :unprocessable_content
|
||||||
end
|
end
|
||||||
|
|
||||||
def extra_questions
|
def extra_questions
|
||||||
|
|||||||
@@ -536,7 +536,7 @@ class MaterialsController < ApplicationController
|
|||||||
errors: { },
|
errors: { },
|
||||||
base_errors: ['ZIP export に必要な素材ファイルが欠損しています.'],
|
base_errors: ['ZIP export に必要な素材ファイルが欠損しています.'],
|
||||||
missing_files: },
|
missing_files: },
|
||||||
status: :unprocessable_entity
|
status: :unprocessable_content
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_uploaded_material_blob! file, file_sha256
|
def build_uploaded_material_blob! file, file_sha256
|
||||||
|
|||||||
@@ -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_entity unless name && internal.length <= 1
|
return head :unprocessable_content 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_entity
|
return head :unprocessable_content
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
index = 0
|
index = 0
|
||||||
|
|||||||
@@ -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_entity if requested_post_id <= 0
|
return head :unprocessable_content 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_entity if requested_post_id <= 0
|
return head :unprocessable_content if requested_post_id <= 0
|
||||||
|
|
||||||
conflicted = false
|
conflicted = false
|
||||||
|
|
||||||
|
|||||||
@@ -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_entity)
|
expect(response).to have_http_status(:unprocessable_content)
|
||||||
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_entity)
|
expect(response).to have_http_status(:unprocessable_content)
|
||||||
expect(json).to include(
|
expect(json).to include(
|
||||||
'type' => 'validation_error',
|
'type' => 'validation_error',
|
||||||
'message' => '入力内容を確認してください.')
|
'message' => '入力内容を確認してください.')
|
||||||
|
|||||||
新しいイシューから参照
ユーザーをブロックする