Fix deserialization of nil relationships

failing test

use try for when the assoc_data is possibly nil

rubocop test/action_controller/json_api/deserialization_test.rb -a

attempt to work on rails-master

account for rails/master having  instead of nil for assoc_data

added changelog
This commit is contained in:
NullVoxPopuli 2016-04-01 08:39:23 -04:00
parent 96c5516d21
commit 5be33afbfb
3 changed files with 44 additions and 1 deletions

View File

@ -34,6 +34,7 @@ Features:
- [#1340](https://github.com/rails-api/active_model_serializers/pull/1340) Add support for resource-level meta. (@beauby) - [#1340](https://github.com/rails-api/active_model_serializers/pull/1340) Add support for resource-level meta. (@beauby)
Fixes: Fixes:
- [#1651](https://github.com/rails-api/active_model_serializers/pull/1651) Fix deserialization of nil relationships. (@NullVoxPopuli)
- [#1480](https://github.com/rails-api/active_model_serializers/pull/1480) Fix setting of cache_store from Rails configuration. (@bf4) - [#1480](https://github.com/rails-api/active_model_serializers/pull/1480) Fix setting of cache_store from Rails configuration. (@bf4)
Fix uninentional mutating of value in memory cache store. (@groyoh) Fix uninentional mutating of value in memory cache store. (@groyoh)
- [#1622](https://github.com/rails-api/active_model_serializers/pull/1622) Fragment cache changed from per-record to per-serializer. - [#1622](https://github.com/rails-api/active_model_serializers/pull/1622) Fragment cache changed from per-record to per-serializer.

View File

@ -188,7 +188,9 @@ module ActiveModelSerializers
end end
polymorphic = (options[:polymorphic] || []).include?(assoc_name.to_sym) polymorphic = (options[:polymorphic] || []).include?(assoc_name.to_sym)
hash["#{prefix_key}_type".to_sym] = assoc_data[:type] if polymorphic if polymorphic
hash["#{prefix_key}_type".to_sym] = assoc_data.present? ? assoc_data[:type] : nil
end
hash hash
end end

View File

@ -9,10 +9,50 @@ module ActionController
parsed_hash = ActiveModelSerializers::Deserialization.jsonapi_parse(params) parsed_hash = ActiveModelSerializers::Deserialization.jsonapi_parse(params)
render json: parsed_hash render json: parsed_hash
end end
def render_polymorphic_parsed_payload
parsed_hash = ActiveModelSerializers::Deserialization.jsonapi_parse(
params,
polymorphic: [:restriction_for, :restricted_to]
)
render json: parsed_hash
end
end end
tests DeserializationTestController tests DeserializationTestController
def test_deserialization_of_relationship_only_object
hash = {
'data' => {
'type' => 'restraints',
'relationships' => {
'restriction_for' => {
'data' => {
'type' => 'discounts',
'id' => '67'
}
},
'restricted_to' => {
'data' => nil
}
}
},
'restraint' => {}
}
post :render_polymorphic_parsed_payload, params: hash
response = JSON.parse(@response.body)
expected = {
'restriction_for_id' => '67',
'restriction_for_type' => 'discounts',
'restricted_to_id' => nil,
'restricted_to_type' => nil
}
assert_equal(expected, response)
end
def test_deserialization def test_deserialization
hash = { hash = {
'data' => { 'data' => {