Skip to content

Instantly share code, notes, and snippets.

@cadwallion
Created May 2, 2012 13:54
Show Gist options
  • Save cadwallion/2576678 to your computer and use it in GitHub Desktop.
Save cadwallion/2576678 to your computer and use it in GitHub Desktop.
ActiveModel::Serializer fails w/ Array of Hashes
# This is a problem with an array of Hash objects wherein each Hash object
# needs to be manipulated rather than all keys serialized.
#
# @bracket.class # => Bracket
# @bracket.seats.class # => Array
# @bracket.seats[0].class # => Hash
# @bracket.seats[0].keys # => ['position','round', 'won']
class BracketSerializer < ActiveModel::Serializer
attribute :final_size, key: :size
attributes :type, :title
# this is necessary in order to do any filtration on a per-seat basis,
# even though seats is an array of Hashes, not an array of Seat objects
has_many :seats, serializer: SeatSerializer
# Returns an array of hashes in binary tree format
#
# Because Hash does not respond to `read_attribute_for_serialization`,
# ActiveModel::Serializer explodes trying to serialize the has_many
def seats
bracket.to_tree.to_a
end
end
undefined method `read_attribute_for_serialization' for {:position=>256, :round=>9}:Hash
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:493:in `block in attributes'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:492:in `each'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:492:in `attributes'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:397:in `serializable_hash'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:191:in `block in serialize'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:190:in `map'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:190:in `serialize'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:464:in `include!'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:410:in `block in include_associations!'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:403:in `each'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:403:in `include_associations!'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:398:in `serializable_hash'
MY_PROJECT_DIR/bundler/gems/active_model_serializers-a2d73faa6335/lib/active_model/serializer.rb:387:in `as_json'
# The serializer used to handle data filtration on each Hash
# in the Bracket seat array
class SeatSerializer < ActiveModel::Serializer
attributes :position, :round
end
@AlexCppns
Copy link

Hello,

I have the same problem. Did you find the mistake eventually?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment