Rapport : Tentatives de remplacement du modèle `show.rss.erb` et problèmes observés

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.erb personnalisé dans discourse-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 .rss d’un sujet entraîne une erreur oops.

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 !

  • Je pense que vous devriez utiliser __FILE__ au lieu de __dir__
  • Si vous l’appelez en dehors d’un corps de classe, ce devrait être self.prepend_view_path

Donc, je crois que cela fonctionnera

after_initialize do
  class ::TopicsController
    self.prepend_view_path File.expand_path("../app/views", __FILE__)
  end
end