파일 변경 플러그인의 간단한 예시가 있을까요?

저는 Ruby에 대해 많이 읽고, 이 언어가 우리에게 제공하는 장점을 알게 된 후, Discourse에서 가장 기본적인 플러그인을 처음 작성해보려고 합니다 :slight_smile:

배지, 리더보드(게임화)와 같은 특정 페이지에 텍스트를 추가하거나, 검색 결과의 기본 정렬 방식을 변경하여 관련도 대신 최신 게시물을 우선하도록 하는 등 단순한 수정을 하고 싶습니다.

핵심 코드를 포크하는 대신 플러그인을 작성하는 것이 최선의 접근법이라는 것은 알고 있습니다. 그렇다면 Discourse의 특정 파일을 플러그인에서 수정하려면 어디를 살펴봐야 할까요?

이 파일을 수정하는 예를 들어 보겠습니다:

Discourse가 기본 topic_embed.rb 대신 플러그인의 topic_embed.rb를 사용하도록 어떻게 지시할 수 있을까요?

이것은 "몽키 패칭(monkey patching)"이라고 알려진 기법입니다. 이를 구현하는 방법은 여러 가지가 있지만, 가장 쉬운 방법은 플러그인에서 교체하려는 메서드를 직접 정의하는 것입니다.

after_initialize do
  class ::TopicEmbed
    def self.imported_from_html(url)
       # your code
    end
  end
end

음, 우리는 원숭이에서 왔다고 하니까 결국 그 예시를 따르는 것이 좋은 일일 수도 있겠네요 :slight_smile:

답변해 주셔서 감사합니다! 지금 시도해 보고 있는데, embed.rb 파일 전체를 변경하고 싶다면 어떻게 해야 하나요?

특정 클래스만 대체하는 데 사용할 수 있다는 것을 알 수 있지만, 나는 버튼을 제거하고 간단한 onebox를 표시하도록 embed를 완전히 대체하고 싶습니다.

파일 자체는 작업할 수 있지만, 포크(fork)하지 않고 그 파일을 Discourse에 어떻게 넣어야 할지 모르겠습니다 (그것은 고릴라 패칭(gorilla patching)인 것 같습니다).

여기에는 이미 존재하는 자료들이 매우 많습니다. 기존 플러그인 수십 개만 봐도 알 수 있습니다.

원박스(onebox) 시스템을 오버라이드하는 예시는 다음과 같습니다:

패칭은 매우 정밀하고 교묘하게 수행될 수 있습니다(이 플러그인은 특별히 그렇지 않지만, 이는 오버라이드가 필연적으로冗長(여러 줄)해질 수밖에 없는 이 코어 코드 구조 때문이기도 합니다). 그 기술의 핵심은 원하는 효과를 얻기 위해 가능한 한 최소한의 작업을 수행하는 것입니다: 전체 파일을 오버라이드하려는 경우라면 전체적인 접근 방식을 다시 한번 검토해 보시는 것이 좋습니다.

또한 리처드가 말했듯이, (적어도 Ruby on Rails에서는) 거의 전체 파일을 오버라이드하지 않습니다. 메서드 단위로 생각해야 합니다.