سؤال

أنا استخدم مصفاة في موقعنا للسماح لمحتوى الموظفين التقنيين الأقل بتحديث المحتوى. داخل الأحجار الكريمة ، لديهم فئة صفحات تقوم بتخطيط كل صفحة من المستوى الأعلى على الموقع. أرغب في استخدام جوهرة ACTS_AS_TAGGAGE في فئة هذه الصفحة. الآن يمكنني إضافة إعلان ACTS_AS_TAGGLE مباشرة إلى ملف page.rb ، ولكن بعد ذلك يجب أن أحافظ على ريبو GIT منفصل لتتبع الاختلافات بين الإصدار والإصدار الرسمي.

استنادًا إلى بعض الأسئلة الأخرى هنا ، قمت بإنشاء مُهيئ وتمديد مثل SO:

lib/page_extensions.rb:

module Pants
  module Extensions

    module Page
      module ClassMethods
        def add_taggable
          acts_as_taggable
        end
      end

      def self.included(base)
        base.extend(ClassMethods).add_taggable
      end

    end

  end
end

التكوين/المبدعون/السراويل

require 'page_extensions'

Page.send :include, Pants::Extensions::Page

تطبيق/طرق عرض/تخطيطات/application.html.erb

...
Tags: <%= @page.tag_list %>

في المرة الأولى التي أطلب فيها صفحة من الخادم ، تقوم بإخراج جميع العلامات في الصفحة بشكل صحيح. ومع ذلك ، إذا وصلت إلى تحديث ، فأنا أحصل على ملف NoMethodError مما يشير إلى أن tag_list غير محدد.

أنا جديد على Rails ، لذا ربما تكون افتراضاتي خاطئة ، لكنني كنت أتوقع أن تقوم Call to Page.Send بإجراء تغيير دائم في فئة الصفحة بدلاً من مثيل محدد للفصل. فكيف يمكنني إضافة ACTS_AS_TAGGABLE إلى فئة الصفحة في كل طلب؟

هل كانت مفيدة؟

المحلول

ستحتاج إلى وضع رمز module_eval في ملف config.to_prepare do منع. أسهل مكان للقيام بذلك هو في config/application.rb أو لإنشاء محرك. الكود متطابق إلا أنه ينفذ في كل مرة تقوم فيها بتشغيل الموقع ، وليس فقط المرة الأولى (التي تنطبق بشكل خاص على وضع التطوير) والرمز الذي يتم تنفيذه فقط قبل عملية التهيئة (المعروف أيضًا باسم طلبات) إلى أ config.before_initialize do منع.

السبب في أن config.to_prepare من المهم أنه في وضع التطوير ، يتم إعادة تحميل الكود على كل طلب ولكن المهيئات غير المهيمنة ليست كذلك. هذا يعني ذاك Page, ، التي تقوم بتشغيل وحدة نمطية _ ، لن يكون لها سوى تشغيل module_eval مرة واحدة ولكنها ستعمل على إعادة تحميل كل طلب. config.to_prepare هو خطاف القضبان الذي يعمل في كل مرة يوفر راحة كبيرة لحالات مثل هذا.

نهج التكوين/التطبيق

class Application < Rails::Application
  # ... other stuff ...

  config.before_initialize do
    require 'page_extensions'
  end

  config.to_prepare do
    Page.send :include, Pants::Extensions::Page
  end
end

نهج المحرك

إذا كنت لا تريد التعديل config/application.rb ثم يمكنك ، في مصفاة CMS ، إنشاء vendor/engines/add_page_extensions/lib/add_page_extensions.rb الذي سيبدو هكذا:

require 'refinery'

module Refinery
  module AddPageExtensions
    class Engine < Rails::Engine

      config.before_initialize do
        require 'page_extensions'
      end

      config.to_prepare do
        Page.send :include, Pants::Extensions::Page
      end

    end
  end
end

إذا كنت تستخدم نهج المحركات ، فستحتاج أيضًا إلى إنشائها vendor/engines/add_page_extensions/add_page_extensions.gemspec التي يجب أن تحتوي على جوهرة بسيطة:

Gem::Specification.new do |s|
  s.name = 'add_page_extensions'
  s.require_paths = %w(lib)
  s.version = 1.0
  s.files = Dir["lib/**/*"]
end

ثم في الخاص بك Gemfile أضف هذا الخط:

gem 'add_page_extensions', :path => 'vendor/engines'

إذا ذهبت إلى نهج المحرك ، فربما تريد وضع كل منطقك داخل المحرك lib دليل بما في ذلك Pants::Extensions::Page الشفرة.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top