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系の記事などを書き連ねています

広告

[書籍] 世界一楽しい決算書の読み方感想まとめ

  こういう人におすすめ 決算書を読もうとして挫折した人 企業分析したい投資家 会社で経営企画担当、管理職などのポジションの人 概要 著者はTwitterで会計クイズを行なっている 「大手町のランダムウォーカー」さん 。 「日本人全員が財務諸表を読める世界を創る」 を合言葉にして...

QooQ