`:unprocessable_entity` deprecated in newest Rack, and causing a `0` response
还没有人认领这个 Issue。
评估
调研方向
从复现的 BugTest 开始,尤其是 test_create_your_models,并找到会访问 Rack::Utils::SYMBOL_TO_STATUS_CODE 的 jsonapi-resources 状态查找逻辑。在所示的 Rails 7.1.3.4 设置下,验证响应报告 HTTP 422 而不是 0,即表示完成。
由索引模型根据 Issue 内容生成。
描述
This issue is a (choose one):
- Problem/bug report.
- Feature request.
- Request for support. Note: Please try to avoid submitting issues for support requests. Use Gitter instead.
Checklist before submitting:
- I've searched for an existing issue.
- I've asked my question on Gitter and have not received a satisfactory answer.
- I've included a complete bug report template. This step helps us and allows us to see the bug without trying to reproduce the problem from your description. It helps you because you will frequently detect if it's a problem specific to your project.
- The feature I'm asking for is compliant with the JSON:API spec.
Description
A change introduced to Rack deprecates the status : unprocessable_entity in favour of :unprocessable_content. They have handled this deprecation internally, however jsonapi-resources retrieves the status code by directly accessing the Rack::Utils::SYMBOL_TO_STATUS_CODE hash. Due to the deprecation, no status is found which results in jsonapi-resources returning a 0 status when there are validation errors.
Short term this can be fixed by using the Rack methods for status retrieval rather than accessing the hash directly. Longer term, jsonapi-resources will need to stop using :unprocessable_entity in favour of : unprocessable_entity but it would have to be done in a way that checks the version of Rack.
Reproducible code:
begin
require 'bundler/inline'
require 'bundler'
rescue LoadError => e
STDERR.puts 'Bundler version 1.10 or later is required. Please update your Bundler'
raise e
end
gemfile(true, ui: ENV['SILENT'] ? Bundler::UI::Silent.new : Bundler::UI::Shell.new) do
source 'https://rubygems.org'
gem 'rails', '7.1.3.4', require: false
gem 'sqlite3', '~> 1.4'
if ENV['JSONAPI_RESOURCES_PATH']
gem 'jsonapi-resources', path: ENV['JSONAPI_RESOURCES_PATH'], require: false
else
gem 'jsonapi-resources', git: 'https://github.com/cerebris/jsonapi-resources', require: false
end
end
# prepare active_record database
require 'active_record'
class NullLogger < Logger
def initialize(*_args)
end
def add(*_args, &_block)
end
end
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
ActiveRecord::Base.logger = ENV['SILENT'] ? NullLogger.new : Logger.new(STDOUT)
ActiveRecord::Migration.verbose = !ENV['SILENT']
ActiveRecord::Schema.define do
# Add your schema here
create_table :your_models, force: true do |t|
t.string :name
end
end
# create models
class YourModel < ActiveRecord::Base
validates :name, presence: true
end
# prepare rails app
require 'action_controller/railtie'
# require 'action_view/railtie'
require 'jsonapi-resources'
class ApplicationController < ActionController::Base
end
# prepare jsonapi resources and controllers
class YourModelsController < ApplicationController
include JSONAPI::ActsAsResourceController
end
class YourModelResource < JSONAPI::Resource
attribute :name
filter :name
end
class TestApp < Rails::Application
config.root = File.dirname(__FILE__)
config.logger = ENV['SILENT'] ? NullLogger.new : Logger.new(STDOUT)
Rails.logger = config.logger
secrets.secret_token = 'secret_token'
secrets.secret_key_base = 'secret_key_base'
config.eager_load = false
config.hosts << 'example.org'
end
# initialize app
Rails.application.initialize!
JSONAPI.configure do |config|
config.json_key_format = :underscored_key
config.route_format = :underscored_key
end
# draw routes
Rails.application.routes.draw do
jsonapi_resources :your_models, only: [:index, :create]
end
# prepare tests
require 'minitest/autorun'
require 'rack/test'
# Replace this with the code necessary to make your test fail.
class BugTest < Minitest::Test
include Rack::Test::Methods
def json_api_headers
{'Accept' => JSONAPI::MEDIA_TYPE, 'CONTENT_TYPE' => JSONAPI::MEDIA_TYPE}
end
def test_index_your_models
record = YourModel.create! name: 'John Doe'
get '/your_models', nil, json_api_headers
assert last_response.ok?
json_response = JSON.parse(last_response.body)
refute_nil json_response['data']
refute_empty json_response['data']
refute_empty json_response['data'].first
assert record.id.to_s, json_response['data'].first['id']
assert 'your_models', json_response['data'].first['type']
assert({'name' => 'John Doe'}, json_response['data'].first['attributes'])
end
def test_create_your_models
json_request = {
'data' => {
type: 'your_models',
attributes: {
name: nil
}
}
}
post '/your_models', json_request.to_json, json_api_headers
puts last_response.status
assert last_response.status == 422
refute_nil YourModel.find_by(name: 'Jane Doe')
end
private
def app
Rails.application
end
end
- 主要语言
- Ruby
- 星标
- 2.3k
- 派生
- 546
- PR 合并指标
- 30 天内没有已合并 PR
贡献指南
这个仓库没有索引到贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
JSONAPI-Resources/jsonapi-resources 的其他 Issue
-
难度 1/5 1 小时以内 新手友好度 85/100
-
难度 3/5 1-2 天 新手友好度 50/100
JSONAPI-Resources/jsonapi-resources#1488 · 1 条评论 ·
-
难度 4/5 3-5 天 新手友好度 42/100
JSONAPI-Resources/jsonapi-resources#1479 · 2 条评论 ·
-
难度 4/5 3-5 天 新手友好度 30/100
JSONAPI-Resources/jsonapi-resources#1477 · 3 条评论 · 1 个 reaction ·
-
难度 3/5 1-2 天 新手友好度 45/100
查看 JSONAPI-Resources/jsonapi-resources 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 70/100
-
bug
难度 1/5 1 小时以内 新手友好度 90/100
riscv/riscv-unified-db#2626 ·
-
Component: GLib
难度 2/5 1-3 小时 新手友好度 70/100
-
ds-drift
难度 2/5 1-3 小时 新手友好度 70/100
we-promise/sure#3693 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
simp/pupmod-simp-simp#395 ·