Objectif
- Remplacer le modèle Discourse d’origine à l’emplacement
discourse/app/views/topics/show.rss.erb. - Placer un modèle personnalisé dans le répertoire du plugin :
discourse-XXX/app/views/topics/show.rss.erb. - Objectif : Faire en sorte que les pages RSS chargent le modèle du plugin au lieu du modèle d’origine.
Approches tentées et résultats
Approche 1 : Placement direct du modèle personnalisé dans le répertoire du plugin
- Action : Placer le fichier
show.rss.erbpersonnalisé dansdiscourse-XXX/app/views/. - Résultat : Le modèle d’origine est toujours utilisé ; la page RSS ne charge pas le modèle du plugin.
Approche 2 : after_initialize avec prepend_view_path
after_initialize do
class ::TopicsController
prepend_view_path File.expand_path("../app/views", __dir__)
end
end
- Résultat : Le modèle du plugin est ignoré ; la page RSS continue d’utiliser le modèle d’origine.
Approche 3 : after_initialize avec prepend_view_path pointant vers le répertoire du plugin
after_initialize do
class ::TopicsController
prepend_view_path Rails.root.join("plugins/discourse-XXX-plugin-name/app/views")
end
end
- Résultat : Le modèle du plugin n’est toujours pas utilisé ; la page RSS continue de rendre le modèle d’origine.
Approche 4 : Remplacer la méthode feed et rendre explicitement le modèle du plugin
class ::TopicsController
prepend_view_path Rails.root.join("plugins/discourse-XXX/app/views")
alias_method :original_feed, :feed
def feed
raise Discourse::NotFound if !Post.exists?(topic_id: params[:topic_id])
begin
@topic_view = TopicView.new(params[:topic_id])
rescue Discourse::NotLoggedIn
raise Discourse::NotFound
rescue Discourse::InvalidAccess => ex
deleted =
guardian.can_see_topic?(ex.obj, false) ||
(!guardian.can_see_topic?(ex.obj) && ex.obj&.access_topic_via_group && ex.obj.deleted_at)
raise Discourse::NotFound.new(
nil,
check_permalinks: deleted,
original_path: ex.obj.relative_url,
)
end
@first_post = @topic_view.posts.first
discourse_expires_in 1.minute
response.headers["X-Robots-Tag"] = "noindex, nofollow"
render file: Rails.root.join("plugins/discourse-XXX/app/views/topics/show.rss.erb"), formats: [:rss]
end
end
- Résultat : Le modèle du plugin semble être appelé, mais la visite de la page
.rssd’un sujet entraîne une erreuroops.
J’espère que ce rapport résume clairement les tentatives et les problèmes rencontrés. J’apprécierais grandement toute idée, suggestion ou solution de la communauté pour remplacer avec succès le modèle show.rss.erb. Merci d’avance pour votre aide !