زيادة نموذج من جوهرة خارجية
-
26-09-2019 - |
سؤال
أنا استخدم مصفاة في موقعنا للسماح لمحتوى الموظفين التقنيين الأقل بتحديث المحتوى. داخل الأحجار الكريمة ، لديهم فئة صفحات تقوم بتخطيط كل صفحة من المستوى الأعلى على الموقع. أرغب في استخدام جوهرة 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
الشفرة.
أتمنى أن يساعدك هذا