皆さん、こんにちは。
Discourse のシリアライザーの拡張方法を学んでいるのですが、まだ完全には理解できていない動作に遭遇しました。
PostSerializer#raw をオーバーライドするために、このコードを追加しました。
require_dependency "post_serializer"
class ::PostSerializer
def raw
if scope.can_edit?(object)
object.raw
else
object.raw&.truncate(300)
end
end
end
これは完璧に動作します。
しかし、これを super を使用するように変更すると、次のようになります。
require_dependency "post_serializer"
class ::PostSerializer
def raw
if scope.can_edit?(object)
super
else
object.raw&.truncate(300)
end
end
end
scope.can_edit?(object) が true の場合、super の呼び出しが /posts/<id>.json で 500 エラーを返す原因となります。
object.raw を super の代わりに使うことで問題を回避できることは分かっていますが、特に他のメソッド(cooked、post_stream など)もオーバーライドしていて、それらのケースでは super が正常に動作するため、なぜ super がこのケースで例外を引き起こすのかを理解したいのです。
Discourse の内部構造にはまだ慣れていないため、以下の点について説明していただけると大変助かります。
PostSerializer#raw内でsuperが実際に解決するものは何か- なぜこのケースで
superを呼び出すと 500 エラーになるのか - なぜ
rawはcookedのようなメソッドとは異なる動作をするのか
よろしくお願いします!