I'm getting the error:
<NoMethodError: undefined method `read_attribute_for_serialization' for #<Record::ActiveRecord_Relation:0x007faa7cfe3318>>   The error is on third line of the snippet.
  def artist     @records = Record.where('artist_id = ' + params[:artist_id])     render :json => @records, serializer: RecordSummarySerializer   end   This is an alternate serializer for the controller RecordsContrller. The other one, 'RecordsSerializer, works fine.
A search on this error brought up a few solutions. Some were unclear as to where one would add code. Another suggested adding:
alias :read_attribute_for_serialization :send   to the class where the error occurs. It didn't work for me. I also looked through the gem documentation. I found an example of the use of serializer:. It was clear any other code was needed.
I'm using Ruby 2.3.0 and Rails 5.0.0.
class RecordsController < ApplicationController ...   def index     @records = Record.order('title')     render :json => @records   end    def artist     @records = Record.where('artist_id = ' + params[:artist_id])     render :json => @records, serializer: RecordSummarySerializer   end ... end   class Record < ActiveRecord::Base   belongs_to :artist   belongs_to :label   belongs_to :style   has_many :tracks   has_many :credits    validates :title, presence: true   validates :catalog, presence: true end   include ActiveModel::Serialization class RecordSummarySerializer < ActiveModel::Serializer   attributes :id, :artist_id, :label_id, :style_id, :title, :catalog,              :recording_date, :penguin, :category end   class RecordSerializer < ActiveModel::Serializer   attributes :id, :artist_id, :label_id, :style_id, :title, :catalog,     :alternate_catalog,          :recording_date, :notes, :penguin, :category   has_one :artist   has_many :tracks end     create_table "records", unsigned: true, force: :cascade, options:   "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|     t.string   "title",             limit: 50     t.string   "catalog",           limit: 20,                          null: false     t.string   "alternate_catalog", limit: 20     t.integer  "artist_id",                                                          unsigned: true     t.integer  "label_id",                                                null: false, unsigned: true     t.integer  "style_id",                                                           unsigned: true     t.datetime "recording_date"     t.text     "notes",             limit: 4294967295     t.string   "penguin",           limit: 50     t.string   "category",          limit: 50,         default: "jazz"     t.index ["artist_id"], name: "RecordHasOneArtist", using: :btree     t.index ["label_id"], name: "RecordHasOneLabel", using: :btree     t.index ["style_id"], name: "RecordHasOneStyle", using: :btree   end   I just noticed, the primary key, id, doesn't appear in the schema. I see it in Sequel Pro when I view the table structure.
I added the the code suggested by @JMazzy. I now get the error:
<NoMethodError: undefined method `id' for #<Record::ActiveRecord_Relation:0x007faa8005a9d8>\nDid you mean?  ids> 
                I had the same error and found changing serializer: to each_serializer: in the controller solved the issue.
Controller
class RecordsController < ApplicationController ...   def artist     @records = Record.where('artist_id = ' + params[:artist_id])     render :json => @records, each_serializer: RecordSummarySerializer   end ... end   record_summary_serializer.rb - can remove the include line
class RecordSummarySerializer < ActiveModel::Serializer   attributes :id, :artist_id, :label_id, :style_id, :title, :catalog,              :recording_date, :penguin, :category end   From active_model_serializers documentation.
Updated link. thanks Lowryder
You need to add include ActiveModel::Serialization to your model. Extended serialization is not included by default in ActiveModel. See this answer on GitHub.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With