기본 show.rss.erb 템플릿을 대체하여 토픽 RSS 출력을 커스터마이즈하는 공식적으로 지원되는 방법은 무엇인가요?

목표

  • discourse/app/views/topics/show.rss.erb에 있는 원래의 Discourse 템플릿을 대체합니다.
  • 커스텀 템플릿을 플러그인 디렉토리에 배치합니다: discourse-XXX/app/views/topics/show.rss.erb.
  • 목표: RSS 페이지가 원래 템플릿 대신 플러그인 템플릿을 로드하도록 하는 것입니다.

시도한 방법과 결과

방법 1: 커스텀 템플릿을 플러그인 디렉토리에 직접 배치

  • 실행: 커스텀 show.rss.erb를 discourse-XXX/app/views/topics/에 넣습니다.
  • 결과: 여전히 원래 템플릿이 사용되며, RSS 페이지는 플러그인 템플릿을 로드하지 않습니다.

방법 2: after_initialize와 prepend_view_path 사용

after_initialize do
  class ::TopicsController
    prepend_view_path File.expand_path("../app/views", __dir__)
  end
end
  • 결과: 플러그인 템플릿이 무시되고, RSS 페이지는 여전히 원래 템플릿을 사용합니다.

방법 3: 플러그인 디렉토리를 가리키는 after_initialize와 prepend_view_path 사용

after_initialize do
  class ::TopicsController
    prepend_view_path Rails.root.join("plugins/discourse-XXX-plugin-name/app/views")
  end
end
  • 결과: 여전히 플러그인 템플릿이 사용되지 않으며, RSS 페이지는 원래 템플릿을 렌더링합니다.

방법 4: feed 메서드를 오버라이드하여 플러그인 템플릿을 명시적으로 렌더링

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
  • 결과: 플러그인 템플릿이 호출되는 것으로 보이지만, 토픽의 .rss 페이지를 방문하면 oops 오류가 발생합니다.

이 보고가 시도한 내용과 발생한 문제를 명확히 요약하고 있기를 바랍니다. show.rss.erb 템플릿을 성공적으로 대체하기 위해 커뮤니티의 통찰, 제안 또는 해결책을 진심으로 부탁드립니다. 미리 도움을 주셔서 감사합니다!

  • __dir__ 대신 __FILE__를 사용하는 것이 좋다고 생각합니다.
  • 클래스 본문 외부에서 호출하는 경우 self.prepend_view_path를 사용해야 합니다.

따라서 아래 코드가 작동할 것으로 생각합니다.

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