`show.rss.erb` テンプレートの置き換え試行と観察された問題に関するレポート

目標

  • discourse/app/views/topics/show.rss.erb の元の Discourse テンプレートを置き換える。
  • カスタム テンプレートをプラグイン ディレクトリ discourse-XXX/app/views/topics/show.rss.erb に配置する。
  • 目標: RSS ページが元のテンプレートではなくプラグイン テンプレートを読み込むようにする。

試行したアプローチと結果

アプローチ 1: カスタム テンプレートをプラグイン ディレクトリに直接配置する

  • アクション: カスタム show.rss.erbdiscourse-XXX/app/views/ に配置する。
  • 結果: 元のテンプレートが引き続き使用され、RSS ページはプラグイン テンプレートを読み込みません。

アプローチ 2: after_initializeprepend_view_path を使用する

after_initialize do
  class ::TopicsController
    prepend_view_path File.expand_path("../app/views", __dir__)
  end
end
  • 結果: プラグイン テンプレートは無視され、RSS ページは引き続き元のテンプレートを使用します。

アプローチ 3: プラグイン ディレクトリを指す after_initializeprepend_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 テンプレートを正常に置き換えるための洞察、提案、または解決策があれば、コミュニティからいただけると大変助かります。ご協力に感謝いたします!

  • __FILE____dir__ の代わりに使うべきだと思います
  • クラス本体の外で呼び出す場合は self.prepend_view_path になるはずです

ですので、こちらで動作するはずです

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