# 在 PostSerializer#raw 中调用 super 导致 500 错误，而调用 object.raw 却可以工作的原因是什么？

**URL:** <https://meta.discourse.org/t/why-does-calling-super-in-postserializer-raw-cause-a-500-error-while-calling-object-raw-works/390455>\
**Category:** Development\
**Created:** [2025年十二月4日 21:24 UTC](https://meta.discourse.org/t/why-does-calling-super-in-postserializer-raw-cause-a-500-error-while-calling-object-raw-works/390455 "2025-12-04T21:24:41Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![copymonopoly](https://avatars.discourse-cdn.com/v4/letter/c/4491bb/32.png) [@copymonopoly](https://meta.discourse.org/u/copymonopoly)\
**Post date:** [2025年十二月4日 21:24 UTC](https://meta.discourse.org/t/why-does-calling-super-in-postserializer-raw-cause-a-500-error-while-calling-object-raw-works/390455/1 "2025-12-04T21:24:41Z")

</div>

大家好，

我正在学习如何扩展 Discourse 的序列化器（serializer），遇到了一个我不完全理解的行为。

我添加了以下代码来覆盖 `PostSerializer#raw`：

```plaintext
require_dependency "post_serializer"

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

```

这运行得非常完美。

然而，如果我将其更改为使用 `super`：

```plaintext
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` 等方法不同。

提前感谢任何帮助！

---

_[View the full topic](https://meta.discourse.org/t/why-does-calling-super-in-postserializer-raw-cause-a-500-error-while-calling-object-raw-works/390455)._
