Active_model_serializers: It is raised NoMethodError: undefined method `singularize' for :data:Symbol if you pass string class to option root.

Created on 16 Jul 2019  路  3Comments  路  Source: rails-api/active_model_serializers

Expected behavior vs actual behavior

It does not raise NoMethodError.

Steps to reproduce

# frozen_string_literal: true

begin
  require "bundler/inline"
rescue LoadError => e
  $stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler"
  raise e
end

gemfile(true) do
  source "https://rubygems.org"

  git_source(:github) { |repo| "https://github.com/#{repo}.git" }

  gem "active_model_serializers", "0.10.10"
  gem "pry-byebug"
end

require "active_model"
require "minitest/autorun"

class User < ActiveModelSerializers::Model
  attributes :name
end

class UserSerializer < ActiveModel::Serializer
  attributes :name
end

class BugTest < Minitest::Test
  def test_attributes
    user = User.new(name: :alice)
    actual = ActiveModelSerializers::SerializableResource.new(user, serializer: UserSerializer, root: :data).serializable_hash

    assert_equal actual, {:name=>:alice}
  end
end

Environment

  • ActiveModelSerializers Version 0.10.10
  • ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18]

Backtrace

active_model_serializers] Rendered UserSerializer with ActiveModelSerializers::Adapter::Attributes (1.02ms)
E

Finished in 0.012480s, 80.1282 runs/s, 0.0000 assertions/s.

  1) Error:
BugTest#test_attributes:
NoMethodError: undefined method `singularize' for :data:Symbol
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model/serializer/fieldset.rb:15:in `fields_for'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model/serializer.rb:369:in `serializable_hash'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/adapter/attributes.rb:14:in `serializable_hash'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/serializable_resource.rb:10:in `serializable_hash'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/logging.rb:71:in `block (3 levels) in notify'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:109:in `block in run_callbacks'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/logging.rb:24:in `block (3 levels) in instrument_rendering'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/logging.rb:81:in `block in notify_render'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/notifications.rb:168:in `block in instrument'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:23:in `instrument'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/notifications.rb:168:in `instrument'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/logging.rb:80:in `notify_render'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/logging.rb:23:in `block (2 levels) in instrument_rendering'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/logging.rb:97:in `block in tag_logger'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/tagged_logging.rb:71:in `block in tagged'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/tagged_logging.rb:28:in `tagged'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/tagged_logging.rb:71:in `tagged'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/logging.rb:97:in `tag_logger'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/logging.rb:22:in `block in instrument_rendering'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:118:in `instance_exec'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:118:in `block in run_callbacks'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:136:in `run_callbacks'
    /Users/souka/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/active_model_serializers-0.10.10/lib/active_model_serializers/logging.rb:70:in `block (2 levels) in notify'
    a.rb:33:in `test_attributes'

1 runs, 0 assertions, 0 failures, 1 errors, 0 skips

Related GitHub issues

https://github.com/rails-api/active_model_serializers/issues/2342

Most helpful comment

thanks @taki for reporting the issue :+1: able to reproduce it on my side too. will take a look into this soon

All 3 comments

docs/general/adapters.md#json describes the ways to override the root key.

In short, this works only for the following adapters:

  • :json
  • :json_api

:attributes adapter (which is the default adapter) does not have any effect with the root key.

You can pass in the key as a string in the root option to make it work:
```
actual = ActiveModelSerializers::SerializableResource.new(user, serializer: UserSerializer, root: 'data').serializable_hash

Thank you for reply.

In version 0.10.9, I pass Symbol and root option is working. So, I was surprised.

Is it the expected behavior? If answer is yes, I change my application code.

thanks @taki for reporting the issue :+1: able to reproduce it on my side too. will take a look into this soon

Was this page helpful?
0 / 5 - 0 ratings