Report: Tentativi di sostituzione del template `show.rss.erb` e problemi osservati

Obiettivo

  • Sostituire il template Discourse originale in discourse/app/views/topics/show.rss.erb.
  • Posizionare un template personalizzato nella directory del plugin: discourse-XXX/app/views/topics/show.rss.erb.
  • Obiettivo: Far sì che le pagine RSS carichino il template del plugin invece del template originale.

Approcci Tentati e Risultati

Approccio 1: Posizionamento diretto del template personalizzato nella directory del plugin

  • Azione: Inserire il show.rss.erb personalizzato in discourse-XXX/app/views/topics/.
  • Risultato: Viene ancora utilizzato il template originale; la pagina RSS non carica il template del plugin.

Approccio 2: after_initialize con prepend_view_path

after_initialize do
  class ::TopicsController
    prepend_view_path File.expand_path("../app/views", __dir__)
  end
end
  • Risultato: Il template del plugin viene ignorato; la pagina RSS continua a utilizzare il template originale.

Approccio 3: after_initialize con prepend_view_path che punta alla directory del plugin

after_initialize do
  class ::TopicsController
    prepend_view_path Rails.root.join("plugins/discourse-XXX-plugin-name/app/views")
  end
end
  • Risultato: Il template del plugin non viene ancora utilizzato; la pagina RSS continua a renderizzare il template originale.

Approccio 4: Sovrascrittura del metodo feed e rendering esplicito del template del 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
  • Risultato: Il template del plugin sembra essere chiamato, ma la visita alla pagina .rss di un topic risulta in un errore oops.

Spero che questo report riassuma chiaramente i tentativi e i problemi riscontrati. Apprezzerei molto qualsiasi intuizione, suggerimento o soluzione dalla community per sostituire con successo il template show.rss.erb. Grazie in anticipo per il vostro aiuto!

  • Penso che dovresti usare __FILE__ invece di __dir__
  • Se lo stai chiamando al di fuori di un corpo di classe, dovrebbe essere self.prepend_view_path

Quindi credo che questo funzionerà

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