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を定義していないとエラーとなる。
0 件のコメント:
コメントを投稿