Relatório: Tentativas de Substituir o Template `show.rss.erb` e Problemas Observados

Objetivo

  • Substituir o template original do Discourse em discourse/app/views/topics/show.rss.erb.
  • Colocar um template personalizado no diretório do plugin: discourse-XXX/app/views/topics/show.rss.erb.
  • Meta: Fazer com que as páginas RSS carreguem o template do plugin em vez do template original.

Abordagens Tentadas e Resultados

Abordagem 1: Colocar diretamente o template personalizado no diretório do plugin

  • Ação: Colocar o show.rss.erb personalizado em discourse-XXX/app/views/.
  • Resultado: O template original ainda é usado; a página RSS não carrega o template do plugin.

Abordagem 2: after_initialize com prepend_view_path

after_initialize do
  class ::TopicsController
    prepend_view_path File.expand_path("../app/views", __dir__)
  end
end
  • Resultado: O template do plugin é ignorado; a página RSS continua a usar o template original.

Abordagem 3: after_initialize com prepend_view_path apontando para o diretório do plugin

after_initialize do
  class ::TopicsController
    prepend_view_path Rails.root.join("plugins/discourse-XXX-plugin-name/app/views")
  end
end
  • Resultado: O template do plugin ainda não é usado; a página RSS continua a renderizar o template original.

Abordagem 4: Substituir o método feed e renderizar explicitamente o template do 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: O template do plugin parece ser chamado, mas visitar a página .rss de um tópico resulta em um erro oops.

Espero que este relatório resuma claramente as tentativas e os problemas encontrados. Agradeceria muito quaisquer insights, sugestões ou soluções da comunidade para substituir com sucesso o template show.rss.erb. Obrigado antecipadamente pela sua ajuda!

  • Acho que você deveria usar __FILE__ em vez de __dir__
  • Se você estiver chamando fora de um corpo de classe, deve ser self.prepend_view_path

Então, acredito que isso funcionará

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