كيفية كتابة القضبان mixin التي تمتد عبر نموذج وحدة تحكم و عرض

StackOverflow https://stackoverflow.com/questions/68391

سؤال

في محاولة للحد من قانون الازدواجية في بلدي قليلا القضبان التطبيق ، لقد تم العمل على الحصول على مدونة مشتركة بين النماذج إلى أنها تملك وحدة منفصلة حتى الآن جيدة.

نموذج الأشياء من السهل إلى حد ما ، يجب أن تشمل وحدة في البداية ، على سبيل المثال:

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.

إذا كنت لا تذهب المساعد الطريق ، تحقق القضبان-محركات, التي تهدف إلى تمديد البرنامج المساعد دلالات على وحدات تحكم وجهات النظر بطريقة واضحة.

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