Informe: Intentos de reemplazar la plantilla `show.rss.erb` y problemas observados

Objetivo

  • Reemplazar la plantilla original de Discourse en discourse/app/views/topics/show.rss.erb.
  • Colocar una plantilla personalizada en el directorio del plugin: discourse-XXX/app/views/topics/show.rss.erb.
  • Objetivo: Que las páginas RSS carguen la plantilla del plugin en lugar de la plantilla original.

Enfoques Intentados y Resultados

Enfoque 1: Colocar directamente la plantilla personalizada en el directorio del plugin

  • Acción: Poner show.rss.erb personalizado en discourse-XXX/app/views/topics/.
  • Resultado: Todavía se utiliza la plantilla original; la página RSS no carga la plantilla del plugin.

Enfoque 2: after_initialize con prepend_view_path

after_initialize do
  class ::TopicsController
    prepend_view_path File.expand_path("../app/views", __dir__)
  end
end
  • Resultado: La plantilla del plugin es ignorada; la página RSS continúa utilizando la plantilla original.

Enfoque 3: after_initialize con prepend_view_path apuntando al directorio del plugin

after_initialize do
  class ::TopicsController
    prepend_view_path Rails.root.join("plugins/discourse-XXX-plugin-name/app/views")
  end
end
  • Resultado: La plantilla del plugin todavía no se utiliza; la página RSS continúa renderizando la plantilla original.

Enfoque 4: Sobrescribir el método feed y renderizar explícitamente la plantilla 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
  • Resultado: La plantilla del plugin parece ser llamada, pero al visitar la página .rss de un tema se produce un error oops.

Espero que este informe resuma claramente los intentos y los problemas encontrados. Agradecería enormemente cualquier información, sugerencia o solución de la comunidad para reemplazar con éxito la plantilla show.rss.erb. ¡Gracias de antemano por su ayuda!

  • Creo que deberías usar __FILE__ en lugar de __dir__
  • Si lo llamas fuera del cuerpo de una clase, debería ser self.prepend_view_path

Así que creo que esto funcionará

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