تقرير: محاولات استبدال قالب `show.rss.erb` والمشاكل المرصودة

الهدف

  • استبدال قالب Discourse الأصلي في discourse/app/views/topics/show.rss.erb.
  • وضع قالب مخصص في دليل المكون الإضافي: 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 بنجاح. شكرًا مقدمًا على مساعدتكم!

  • أعتقد أنه يجب عليك استخدام __FILE__ بدلاً من __dir__
  • إذا كنت تستدعيه خارج نص الفئة يجب أن يكون self.prepend_view_path

لذلك أعتقد أن هذا سيعمل

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