active_model_serializers
active_model_serializers copied to clipboard
AMS errors after upgrading from v0.9.5 to v0.10.2
Expected behavior vs actual behavior
Serialize model to JSON after upgrading and making changes required by version 0.10.2.
I'm getting 2 types of errors, one is undefined method '[]' for nil and the other is undefined method root in separate areas.
I've done all the conversions I read, i.e. subclassing from ActiveModelSerializers::Model instead of include ActiveModel::Serialization. Set adapter to :json.
2 questions, what things can cause the undefined method '[]' for nil and how do I set root false in render statements or in serializer classes?
Environment
ActiveModelSerializers Version (commit ref if not on tag): 0.10.2
OS Type & Version: Latest OSX
Integrated application and version (e.g., Rails, Grape, etc): Rails 5.0.0, Ruby 2.3.0
Backtrace
(e.g., provide any applicable backtraces from your application) Failure/Error: render json: ErrorMessage.new(:missing), status: 404
NoMethodError:
undefined method `[]' for nil:NilClass
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model_serializers/model.rb:36:in `read_attribute_for_serialization'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model/serializer.rb:197:in `read_attribute_for_serialization'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model/serializer/field.rb:23:in `value'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model/serializer/attributes.rb:22:in `block in attributes'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model/serializer/attributes.rb:19:in `each'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model/serializer/attributes.rb:19:in `each_with_object'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model/serializer/attributes.rb:19:in `attributes'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model/serializer/caching.rb:216:in `fetch_attributes'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model/serializer.rb:169:in `serializable_hash'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model_serializers/adapter/attributes.rb:7:in `serializable_hash'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model_serializers/adapter/json.rb:6:in `serializable_hash'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/active_model_serializers-0.10.2/lib/active_model_serializers/adapter/base.rb:59:in `as_json'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/activesupport-5.0.0/lib/active_support/json/encoding.rb:33:in `encode'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/activesupport-5.0.0/lib/active_support/json/encoding.rb:20:in `encode'
# /Users/hm/.rvm/gems/ruby-2.3.0@loop_server/gems/activesupport-5.0.0/lib/active_support/core_ext/object/json.rb:37:in `to_json'
....
undefined method '[]' for nil
you are likely explicitly passing nil into a serializer. We don't protect you against that as the problem is in userland
how do I set root false in render
likely what you want here is to pass in adapter: :attributes.
Much appreciate for writing. Anything you can share back to help others upgrade is much appreciated and makes the world a better place :)
See https://github.com/rails-api/active_model_serializers/pull/1844 for an example
I've recently upgraded from patched 0.9.5 version to 0.10.2. I want to share with my adapters and common changes in codebase: https://gist.github.com/sineed/9c9a5d837d558e79309f90919a9b7aad.
For example, for root: false option I've implemented my own adapter.
Hope it helps somebody.
@sineed that's fantastic! Would you be interested in writing it up in a PR like https://github.com/rails-api/active_model_serializers/pull/1844 ?
I think my solution is quite specific that is why I created gist. I don't think that it is a good idea to make it like general solution for everyone. It can help to understand upgrade path but not to be a 100% solution.
Personally, I'd encourage the writing of blog posts about AMS upgrade experiences and strategies, and to keep a list of links to them in a documentation page, or at least a single issue with an upgrading tag, for others to reference.
Does anyone know if there are any good blog posts about this? @bf4, I know this is some years later, but was your upgrade successful?
Besides whether you can, do you want to?
@bf4 Sorry, I missed this message... What do you mean by do I want to? i.e. what are the advantages of AMS 10 over AMS 9? For me, I would like to get this done so I can move the project to Rails 5.