ActiveModel::Serializersでundefined method `read_attribute_for_serialization’

こんにちは!tonです

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を定義していないとエラーとなる。

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です