Я пытаюсь написать свои первые очень простые плагины для Discourse, после того как много прочитал о Ruby и преимуществах, которые этот язык нам предоставляет
Я хочу добавлять текст на конкретные страницы, такие как бейджи, таблица лидеров (геймификация), и выполнять подобные простые правки, например, изменять поведение по умолчанию при сортировке результатов поиска: вместо релевантности — последние посты.
Я понимаю, что лучший подход — не форкать ядро, а писать плагины. Так где мне искать информацию, если я хочу изменить конкретные файлы в Discourse из плагина?
Возьмем для примера редактирование этого файла:
Как указать Discourse использовать плагин topic_embed.rb и заменить им стандартный?
Это техника, известная как «монки-патчинг». Существует несколько способов её реализации, но самый простой — просто определить метод, который вы хотите заменить, в своём плагине.
after_initialize do
class ::TopicEmbed
def self.imported_from_html(url)
# ваш код
end
end
end
Здесь уже есть огромный объём материалов. Просто посмотрите на все десятки существующих плагинов.
Вот пример переопределения системы onebox:
Обратите внимание, что патчинг может быть очень точным и изобретательным (этот плагин не особенно изобретателен, но это отчасти связано со структурой основного кода, которая делает переопределения неизбежно громоздкими). Искусство заключается в том, чтобы сделать как можно меньше для достижения желаемого эффекта: если вы предлагаете переопределять целые файлы, возможно, стоит пересмотреть свой общий подход.
И, как уже отмечал Ричард, вы почти никогда (по крайней мере в Ruby on Rails) не переопределяете целые файлы. Вам нужно думать о методах.