Warum verursacht der Aufruf von super in PostSerializer#raw einen 500er Fehler, während object.raw funktioniert?

Hallo zusammen,

ich lerne gerade, wie man Discourse Serializer erweitert, und bin auf ein Verhalten gestoßen, das ich nicht ganz verstehe.

Ich habe diesen Code hinzugefügt, um PostSerializer#raw zu überschreiben:

require_dependency "post_serializer"

class ::PostSerializer
  def raw
    if scope.can_edit?(object)
      object.raw
    else
      object.raw&.truncate(300)
    end
  end
end

Das funktioniert einwandfrei.

Wenn ich es jedoch ändere, um super zu verwenden:

require_dependency "post_serializer"

class ::PostSerializer
  def raw
    if scope.can_edit?(object)
      super
    else
      object.raw&.truncate(300)
    end
  end
end

Wenn scope.can_edit?(object) wahr ist, führt der Aufruf von super dazu, dass /posts/id.json einen 500er Fehler zurückgibt.

Ich weiß, dass ich das Problem vermeiden kann, indem ich object.raw anstelle von super verwende, aber ich möchte verstehen, warum super in diesem Fall eine Ausnahme auslöst, insbesondere weil ich auch andere Methoden überschreibe (cooked, post_stream usw.) und super in diesen Fällen einwandfrei funktioniert.

Da ich noch neu in den internen Abläufen von Discourse bin, würde ich mich über eine Erklärung freuen, was:

  • super innerhalb von PostSerializer#raw tatsächlich auflöst,
  • warum der Aufruf von super in diesem Fall zu einem 500er Fehler führt,
  • und warum sich raw anders verhält als Methoden wie cooked.

Vielen Dank im Voraus für jede Hilfe!

Ich bin mir ziemlich sicher, dass es daran liegt, dass raw nicht im Serializer für einen normalen Beitrag enthalten ist. Es wird nur dann einbezogen, wenn Sie bearbeiten. Um einen Beitrag anzuzeigen, benötigen Sie nur cooked; es wäre eine Verschwendung, auch raw einzubeziehen, wenn es nicht benötigt wird.

cooked und post_stream sind im Serializer enthalten, daher funktioniert super.