Bericht: Versuche, die `show.rss.erb`-Vorlage zu ersetzen und beobachtete Probleme

Zielsetzung

  • Ersetzen der ursprünglichen Discourse-Vorlage unter discourse/app/views/topics/show.rss.erb.
  • Platzieren einer benutzerdefinierten Vorlage im Plugin-Verzeichnis: discourse-XXX/app/views/topics/show.rss.erb.
  • Ziel: RSS-Seiten sollen die Plugin-Vorlage anstelle der ursprünglichen Vorlage laden.

Versuchte Ansätze und Ergebnisse

Ansatz 1: Direkte Platzierung der benutzerdefinierten Vorlage im Plugin-Verzeichnis

  • Aktion: Die benutzerdefinierte show.rss.erb in discourse-XXX/app/views/ legen.
  • Ergebnis: Die ursprüngliche Vorlage wird weiterhin verwendet; die RSS-Seite lädt die Plugin-Vorlage nicht.

Ansatz 2: after_initialize mit prepend_view_path

after_initialize do
  class ::TopicsController
    prepend_view_path File.expand_path("../app/views", __dir__)
  end
end
  • Ergebnis: Die Plugin-Vorlage wird ignoriert; die RSS-Seite verwendet weiterhin die ursprüngliche Vorlage.

Ansatz 3: after_initialize mit prepend_view_path, der auf das Plugin-Verzeichnis zeigt

after_initialize do
  class ::TopicsController
    prepend_view_path Rails.root.join("plugins/discourse-XXX-plugin-name/app/views")
  end
end
  • Ergebnis: Die Plugin-Vorlage wird immer noch nicht verwendet; die RSS-Seite rendert weiterhin die ursprüngliche Vorlage.

Ansatz 4: Überschreiben der feed-Methode und explizites Rendern der Plugin-Vorlage

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
  • Ergebnis: Die Plugin-Vorlage scheint aufgerufen zu werden, aber der Aufruf einer .rss-Seite eines Themas führt zu einem “oops”-Fehler.

Ich hoffe, dieser Bericht fasst die Versuche und die aufgetretenen Probleme klar zusammen. Ich würde mich sehr über Einblicke, Vorschläge oder Lösungen von der Community freuen, um die show.rss.erb-Vorlage erfolgreich zu ersetzen. Vielen Dank im Voraus für Ihre Hilfe!

  • Ich denke, Sie sollten __FILE__ anstelle von __dir__ verwenden
  • Wenn Sie es außerhalb eines Klassenkörpers aufrufen, sollte es self.prepend_view_path sein

Ich glaube also, dass dies funktionieren wird

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