大家好,
我正在学习如何扩展 Discourse 的序列化器(serializer),遇到了一个我不完全理解的行为。
我添加了以下代码来覆盖 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) 为真时,调用 super 导致 /posts/:id.json 返回 500 错误。
我知道通过使用 object.raw 而不是 super 可以避免这个问题,但我很想了解为什么在这种情况下调用 super 会导致 500 错误,特别是考虑到我也覆盖了其他方法(如 cooked、post_stream 等),并且在那些情况下调用 super 运行正常。
由于我对 Discourse 的内部机制还不太熟悉,我非常希望能得到以下方面的解释:
super在PostSerializer#raw内部实际解析为什么;- 为什么在这种情况下调用
super会导致 500 错误; - 为什么
raw的行为与cooked等方法不同。
提前感谢任何帮助!