ActiveModel::Serializersでundefined method `read_attribute_for_serialization'

2020年7月29日水曜日

Rails

t f B! P L

ActiveModel::Serializersでエラー

json出力するActiveModel::Serializersで以下のエラーが出ることがあります。たまに出るやつで、調べてもあまり情報がなかったので、serializerのソースを読んで原因究明してみました。

undefined method `read_attribute_for_serialization' 

原因

getterがないためです。このエラーはモデルに紐づかないデータをjson出力するときに出ます。

# コントローラ
# jsonを返すメソッド
def success_serializer
  # hashオブジェクトをjson出力する
  hoge_huga = {
    hoge: 'hogehoge',
    huga: 'hugahuga'
  }
  render json: ActiveModelSerializers::SerializableResource.new(
                 hoge_huga,
                 serializer: HogeSerializer
               )
end
# シリアライザー
class HogeSerializer < ActiveModel::Serializer
attributes :hoge, :huga
def hoge
  object[:hoge]
end
# hugaのgetterはない

Modelの継承関係は以下。

XXXModel < ApplicationRecord
ApplicationRecord < ActiveRecord::Base

そして、ActiveRecord::BaseはSerializationモジュールをincludeしている。

Serializationで定義しているread_attribute_for_serializationはModelオブジェクトの属性値を取得するメソッド。以下のように定義して属性値を取得している。

 alias :read_attribute_for_serialization :send

つまり作成したSerializerにModelオブジェクトが渡らない場合はread_attribute_for_serializationが定義されていないため、getterを定義していないとエラーとなる。

自己紹介

Webエンジニアをやっています。日々思ったことや、読書レビュー、IT系の記事などを書き連ねています

広告

[書籍] ティムクック アップルをさらなる高みへと押し上げた天才 感想まとめ

   こういう人におすすめ ティムクックのことを知らないという人 アップル、ジョブズのファン 概要 2011年 ティムクック がAppleのCEOを引き継ぎました。 クック の知名度は低く、批評家たちは ジョブズ なしではAppleは終わりを迎えるだろうと危惧していました。 しか...

QooQ