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)가 true일 때, super 호출로 인해 /posts/<id>.json이 500 오류를 반환합니다.
super 대신 object.raw를 사용하면 문제를 피할 수 있다는 것은 알고 있지만, 왜 이 경우 super가 예외를 발생시키는지 이해하고 싶습니다. 특히 cooked, post_stream 등 다른 메서드도 오버라이드했는데, 그 경우들은 super가 정상적으로 작동하기 때문입니다.
아직 Discourse 내부 구조에 익숙하지 않아 다음 사항에 대한 설명을 정말로 듣고 싶습니다:
설명 감사합니다!
말씀하신 대로 ::PostSerializer를 다시 열었다가 문제가 생긴 것이었네요. prepend로 전환한 뒤에는 모든 것이 예상대로 작동합니다.
현재 이 모듈을 사용하고 있습니다:
module PostSerializerExtension
def raw
if scope.can_edit?(object)
super
else
object.raw&.truncate(300)
end
end
end
reloadable_patch do
require_dependency "post_serializer"
::PostSerializer.prepend(::PostSerializerExtension)
end