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?
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
_(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.
Most helpful comment
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: falseoption I've implemented my own adapter.Hope it helps somebody.