Простой пример плагина для изменения файлов?

Я пытаюсь написать свои первые очень простые плагины для Discourse, после того как много прочитал о Ruby и преимуществах, которые этот язык нам предоставляет :slight_smile:

Я хочу добавлять текст на конкретные страницы, такие как бейджи, таблица лидеров (геймификация), и выполнять подобные простые правки, например, изменять поведение по умолчанию при сортировке результатов поиска: вместо релевантности — последние посты.

Я понимаю, что лучший подход — не форкать ядро, а писать плагины. Так где мне искать информацию, если я хочу изменить конкретные файлы в Discourse из плагина?

Возьмем для примера редактирование этого файла:

Как указать Discourse использовать плагин topic_embed.rb и заменить им стандартный?

Это техника, известная как «монки-патчинг». Существует несколько способов её реализации, но самый простой — просто определить метод, который вы хотите заменить, в своём плагине.

after_initialize do
  class ::TopicEmbed
    def self.imported_from_html(url)
       # ваш код
    end
  end
end

Что ж, мы ведь supposed to происходить от обезьян, так что в конце концов это может быть хорошим делом, следуя вашему примеру :slight_smile:

Спасибо за ваш ответ! Я пробую это, но что мне делать, если я хочу изменить весь файл embed.rb?

Я вижу, что это можно использовать только для замены конкретного класса, но я хочу полностью заменить embed, удалив кнопки и показав простой onebox.

Я могу поработать с файлом, но не знаю, как поместить этот файл в Discourse без форка (это, кажется, горилла-патчинг).

Здесь уже есть огромный объём материалов. Просто посмотрите на все десятки существующих плагинов.

Вот пример переопределения системы onebox:

Обратите внимание, что патчинг может быть очень точным и изобретательным (этот плагин не особенно изобретателен, но это отчасти связано со структурой основного кода, которая делает переопределения неизбежно громоздкими). Искусство заключается в том, чтобы сделать как можно меньше для достижения желаемого эффекта: если вы предлагаете переопределять целые файлы, возможно, стоит пересмотреть свой общий подход.

И, как уже отмечал Ричард, вы почти никогда (по крайней мере в Ruby on Rails) не переопределяете целые файлы. Вам нужно думать о методах.