كيفية كتابة القضبان mixin التي تمتد عبر نموذج وحدة تحكم و عرض
-
09-06-2019 - |
سؤال
في محاولة للحد من قانون الازدواجية في بلدي قليلا القضبان التطبيق ، لقد تم العمل على الحصول على مدونة مشتركة بين النماذج إلى أنها تملك وحدة منفصلة حتى الآن جيدة.
نموذج الأشياء من السهل إلى حد ما ، يجب أن تشمل وحدة في البداية ، على سبيل المثال:
class Iso < Sale
include Shared::TracksSerialNumberExtension
include Shared::OrderLines
extend Shared::Filtered
include Sendable::Model
validates_presence_of :customer
validates_associated :lines
owned_by :customer
def initialize( params = nil )
super
self.created_at ||= Time.now.to_date
end
def after_initialize
end
order_lines :despatched
# tracks_serial_numbers :items
sendable :customer
def created_at=( date )
write_attribute( :created_at, Chronic.parse( date ) )
end
end
هذا هو على ما يرام, ولكن الآن أنا ذاهب إلى بعض تحكم و عرض التعليمات البرمجية التي ستكون مشتركة بين هذه النماذج وكذلك حتى هذا sendable الاشياء:
# This is a module that is used for pages/forms that are can be "sent"
# either via fax, email, or printed.
module Sendable
module Model
def self.included( klass )
klass.extend ClassMethods
end
module ClassMethods
def sendable( class_to_send_to )
attr_accessor :fax_number,
:email_address,
:to_be_faxed,
:to_be_emailed,
:to_be_printed
@_class_sending_to ||= class_to_send_to
include InstanceMethods
end
def class_sending_to
@_class_sending_to
end
end # ClassMethods
module InstanceMethods
def after_initialize( )
super
self.to_be_faxed = false
self.to_be_emailed = false
self.to_be_printed = false
target_class = self.send( self.class.class_sending_to )
if !target_class.nil?
self.fax_number = target_class.send( :fax_number )
self.email_address = target_class.send( :email_address )
end
end
end
end # Module Model
end # Module Sendable
أساسا أنا والتخطيط على مجرد القيام تشمل Sendable::تحكم Sendable::عرض (أو ما يعادلها) على وحدة تحكم عرض ، ولكن ، هناك نظافة طريقة للقيام بذلك ؟ أنا 'م بعد وسيلة أنيقة لديها مجموعة من رموز مشتركة بين نموذج وحدة تحكم و عرض.
تحرير:فقط للتوضيح هذا فقط يجب أن تكون مشتركة عبر 2 أو 3 نماذج.
المحلول
هل يمكن أن pluginize ذلك (استخدام البرنامج النصي/إنشاء البرنامج المساعد).
ثم في الحرف الأول.rb فقط أن تفعل شيئا مثل:
ActiveRecord::Base.send(:include, PluginName::Sendable)
ActionController::Base.send(:include, PluginName::SendableController)
و جنبا إلى جنب مع النفس.وشملت التي يجب أن تعمل على ما يرام.
تحقق من بعض acts_* الإضافات فهي جميلة النمط الشائع (http://github.com/technoweenie/acts_as_paranoid/tree/master/init.rb, تحقق خط 30)
نصائح أخرى
إذا كان هذا الكود يحتاج الى الحصول على إضافة إلى جميع الموديلات وجميع وحدات التحكم ، يمكنك دائما القيام بما يلي:
# maybe put this in environment.rb or in your module declaration
class ActiveRecord::Base
include Iso
end
# application.rb
class ApplicationController
include Iso
end
إذا كنت الوظائف المطلوبة من هذه الوحدة متاحة وجهات النظر ، قد تعرض منهم على حدة مع helper_method
الإعلانات في التطبيق.rb.
إذا كنت لا تذهب المساعد الطريق ، تحقق القضبان-محركات, التي تهدف إلى تمديد البرنامج المساعد دلالات على وحدات تحكم وجهات النظر بطريقة واضحة.