active_model_serializers icon indicating copy to clipboard operation
active_model_serializers copied to clipboard

AMS errors after upgrading from v0.9.5 to v0.10.2

Open hmistry opened this issue 9 years ago • 8 comments

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'

....

hmistry avatar Aug 01 '16 19:08 hmistry

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

bf4 avatar Aug 01 '16 20:08 bf4

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 avatar Aug 10 '16 10:08 sineed

@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 ?

bf4 avatar Aug 10 '16 13:08 bf4

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.

sineed avatar Aug 10 '16 13:08 sineed

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.

remear avatar Aug 12 '16 02:08 remear

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?

aaronromeo avatar Jul 24 '19 01:07 aaronromeo

Besides whether you can, do you want to?

bf4 avatar Jul 24 '19 12:07 bf4

@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.

aaronromeo avatar Aug 07 '19 16:08 aaronromeo