2008-09-16 19 views
5

Trong nỗ lực giảm trùng lặp mã trong ứng dụng Rails nhỏ của tôi, tôi đã làm việc để nhận mã phổ biến giữa các mô hình của mình. rất tốt.Làm thế nào để viết một mixin Rails trải dài trên mô hình, bộ điều khiển và xem

Các công cụ mô hình được khá dễ dàng, tôi chỉ phải bao gồm các mô-đun ban đầu, ví dụ:

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 

này đang làm việc tốt, bây giờ tuy nhiên, tôi sẽ có một số điều khiển và chế độ code đó là sẽ được phổ biến giữa các mô hình này là tốt, cho đến nay tôi có điều này cho các công cụ sendable tôi:

# 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 

về cơ bản tôi đang lập kế hoạch trên chỉ làm một bao gồm Sendable :: Controller, và Sendable :: View (hoặc tương đương) cho bộ điều khiển và khung nhìn, nhưng, có cách nào để làm sạch hơn không điều này? Tôi là sau một cách gọn gàng để có một loạt các mã phổ biến giữa mô hình của tôi, điều khiển, và xem.

Chỉnh sửa: Chỉ cần làm rõ, điều này chỉ cần được chia sẻ trên 2 hoặc 3 mô hình.

Trả lời

7

Bạn có thể thêm plugin (sử dụng tập lệnh/tạo plugin).

Sau đó, trong init.rb của bạn chỉ cần làm một cái gì đó như:

ActiveRecord::Base.send(:include, PluginName::Sendable) 
ActionController::Base.send(:include, PluginName::SendableController) 

Và cùng với self.included của bạn mà nên làm việc tốt.

Kiểm tra ra một số acts_ * plugins, đó là một mô hình khá phổ biến (http://github.com/technoweenie/acts_as_paranoid/tree/master/init.rb, kiểm tra dòng 30)

+0

Tôi đã chọn câu trả lời này, mặc dù Hoyhoy là hoàn toàn tốt là tốt, chỉ vì nó phù hợp với những gì tôi đang làm tốt hơn một chút. – Mike

+0

Nó thực sự giống nhau. Đây là một cú pháp tốt hơn. – hoyhoy

6

Nếu mã mà cần phải được thêm vào tất cả các mô hình và tất cả các bộ điều khiển, bạn luôn có thể làm như sau:

# maybe put this in environment.rb or in your module declaration 
class ActiveRecord::Base 
    include Iso 
end 

# application.rb 
class ApplicationController 
    include Iso 
end 

Nếu bạn cần chức năng từ mô-đun này cung cấp cho các quan điểm, bạn có thể tiếp xúc với chúng riêng với helper_method khai báo trong application.rb.

+0

Đây là những gì tôi có thể sẽ làm, nó không phải là một vấn đề miễn là chức năng của tôi, vv, không có bất kỳ va chạm tên nào? – Mike

1

Nếu bạn đi các tuyến đường plugin, làm kiểm tra Rails-Engines, mà nhằm mục đích mở rộng ngữ nghĩa plugin để Bộ điều khiển và Chế độ xem theo cách rõ ràng.

+0

Tôi đã xem nhanh, điều này có thể giải quyết được vấn đề của tôi. Nhưng tôi không chắc chắn tôi đang ở giai đoạn này chưa. – Mike

Các vấn đề liên quan