저는 Ruby에 대해 많이 읽고, 이 언어가 우리에게 제공하는 장점을 알게 된 후, Discourse에서 가장 기본적인 플러그인을 처음 작성해보려고 합니다
배지, 리더보드(게임화)와 같은 특정 페이지에 텍스트를 추가하거나, 검색 결과의 기본 정렬 방식을 변경하여 관련도 대신 최신 게시물을 우선하도록 하는 등 단순한 수정을 하고 싶습니다.
핵심 코드를 포크하는 대신 플러그인을 작성하는 것이 최선의 접근법이라는 것은 알고 있습니다. 그렇다면 Discourse의 특정 파일을 플러그인에서 수정하려면 어디를 살펴봐야 할까요?
이 파일을 수정하는 예를 들어 보겠습니다:
# downcase
# remove trailing forward slash/
# remove consecutive hyphens
# remove leading and trailing whitespace
url.downcase.sub(%r{/\z}, "").sub(/\-+/, "-").strip
end
def self.imported_from_html(url)
url = UrlHelper.normalized_encode(url)
I18n.with_locale(SiteSetting.default_locale) do
"\n<hr>\n<small>#{I18n.t("embed.imported_from", link: "<a href='#{url}'>#{url}</a>")}</small>\n"
end
end
# Import an article from a source (RSS/Atom/Other)
def self.import(user, url, title, contents, category_id: nil, cook_method: nil, tags: nil)
return unless url =~ %r{\Ahttps?\://}
contents = first_paragraph_from(contents) if SiteSetting.embed_truncate && cook_method.nil?
contents ||= ""
contents = contents.dup << imported_from_html(url)
Discourse가 기본 topic_embed.rb 대신 플러그인의 topic_embed.rb를 사용하도록 어떻게 지시할 수 있을까요?
RGJ
(Richard - Communiteq)
6월 30, 2023, 9:52오후
2
이것은 "몽키 패칭(monkey patching)"이라고 알려진 기법입니다. 이를 구현하는 방법은 여러 가지가 있지만, 가장 쉬운 방법은 플러그인에서 교체하려는 메서드를 직접 정의하는 것입니다.
after_initialize do
class ::TopicEmbed
def self.imported_from_html(url)
# your code
end
end
end
음, 우리는 원숭이에서 왔다고 하니까 결국 그 예시를 따르는 것이 좋은 일일 수도 있겠네요
답변해 주셔서 감사합니다! 지금 시도해 보고 있는데, embed.rb 파일 전체를 변경하고 싶다면 어떻게 해야 하나요?
특정 클래스만 대체하는 데 사용할 수 있다는 것을 알 수 있지만, 나는 버튼을 제거하고 간단한 onebox를 표시하도록 embed를 완전히 대체하고 싶습니다.
파일 자체는 작업할 수 있지만, 포크(fork)하지 않고 그 파일을 Discourse에 어떻게 넣어야 할지 모르겠습니다 (그것은 고릴라 패칭(gorilla patching)인 것 같습니다) .
여기에는 이미 존재하는 자료들이 매우 많습니다. 기존 플러그인 수십 개만 봐도 알 수 있습니다.
원박스(onebox) 시스템을 오버라이드하는 예시는 다음과 같습니다:
# frozen_string_literal: true
# name: discourse-onebox-assistant
# about: provides alternative path for grabbing one-boxes when initial crawl fails
# version: 3.1.1
# authors: merefield
# url: https://github.com/merefield/discourse-onebox-assistant
gem "httparty", "0.24.2"
enabled_site_setting :onebox_assistant_enabled
module ::DiscourseOneboxAssistant
end
require_relative "lib/discourse_onebox_assistant/proxy_service"
require_relative "discourse/lib/oneboxer_edits"
require_relative "discourse/lib/onebox/helpers_edits"
after_initialize do
This file has been truncated. show original
패칭은 매우 정밀하고 교묘하게 수행될 수 있습니다(이 플러그인은 특별히 그렇지 않지만, 이는 오버라이드가 필연적으로冗長(여러 줄)해질 수밖에 없는 이 코어 코드 구조 때문이기도 합니다). 그 기술의 핵심은 원하는 효과를 얻기 위해 가능한 한 최소한의 작업을 수행하는 것입니다: 전체 파일을 오버라이드하려는 경우라면 전체적인 접근 방식을 다시 한번 검토해 보시는 것이 좋습니다.
또한 리처드가 말했듯이, (적어도 Ruby on Rails에서는) 거의 전체 파일을 오버라이드하지 않습니다. 메서드 단위로 생각해야 합니다.