2009-10-05 22 views
5

Tôi có một số mã trong plugin kiểu động cơ bao gồm một số kiểu máy. Trong ứng dụng của tôi, tôi muốn mở rộng một trong các mô hình này. Tôi đã quản lý để thêm cả hai ví dụ và phương thức lớp cho mô hình trong câu hỏi bằng cách bao gồm một mô-đun từ bên trong một initializer.Mở rộng mô hình trong plugin bằng "has_many" bằng mô-đun

Tuy nhiên tôi dường như không thể thêm liên kết, gọi lại, v.v. Tôi gặp lỗi 'phương pháp không tìm thấy'.

/libs/qwerty/core.rb

module Qwerty 
    module Core 
    module Extensions 

     module User 
     # Instance Methods Go Here 

     # Class Methods 
     module ClassMethods 
      has_many :hits, :uniq => true # no method found 

      before_validation_on_create :generate_code # no method found 

      def something # works! 
      "something" 
      end 
     end 

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

/initializers/qwerty.rb

require 'qwerty/core/user' 

User.send :include, Qwerty::Core::Extensions::User 

Trả lời

6

Tôi nghĩ rằng điều này sẽ làm việc

module Qwerty 
    module Core 
    module Extensions 
     module User 
     # Instance Methods Go Here 

     # Class Methods 
     module ClassMethods 
      def relate 
      has_many :hits, :uniq => true # no method found 

      before_validation_on_create :generate_code # no method found 
      end 

      def something # works! 
      "something" 
      end 
     end 

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

Mã cũ là nguyên nhân sai xác nhận và liên kết được gọi khi tải mô-đun và mô-đun này không biết gì về ActiveRecord. Đó là một khía cạnh chung của Ruby, mã bên trong lớp hoặc các mô-đun mô-đun được gọi trực tiếp khi được nạp. Bạn không muốn điều đó. Để có được xung quanh mà bạn có thể sử dụng các giải pháp trên.

+0

Gotcha: Khi thực hiện 'tải lại!' trong giao diện điều khiển, lớp được tải lại nhưng vì mô-đun (trong trường hợp của tôi) được gọi từ trình khởi tạo, mô-đun không được áp dụng lại. – Kris

+0

Hơn nữa tại thời điểm nó xuất hiện mã trong mô-đun chỉ được bao gồm khi sử dụng bàn điều khiển, khi cùng một mã được gọi là từ một bộ điều khiển nó không thành công. Tôi muốn đăng một ví dụ mã nhưng một câu trả lời có vẻ không đúng (đây không phải là một diễn đàn sau khi tất cả) ... – Kris

+0

ĐIỀU KHIỂN: render: text => User.new.respond_to? ('Hits') và return # => false CONSOLE: User.new.respond_to? ('hits') # => true PREEMPT: Tôi đã khởi động lại máy chủ :) – Kris

14

Bạn sẽ có thể thực hiện việc này. IMHO ngắn gọn hơn một chút.

module Qwerty::Core::Extensions::User 
    def self.included(base) 
    base.class_eval do 
     has_many :hits, :uniq => true 
     before_validation_on_create :generate_code 
    end 
    end 
end 
+0

Đây hoàn toàn là câu trả lời đúng. – kikito

4

Trong Rails 3, điều này nghe có vẻ giống như một trường hợp sử dụng tốt cho ActiveSupport :: Lo ngại:

module Qwerty::Core::Extensions::User 

    extend ActiveSupport::Concern 

    included do 
    has_many :hits, :uniq => true 
    before_validation_on_create :generate_code 
    end 
end 

class User 
    include Querty::Core::Extensions::User 
    # ... 
end 

Sau đây là các ActiveSupport::Concern docs và hữu ích nhất blog article trên đó tôi đã tìm thấy.

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