2012-04-15 20 views
17

Tôi đang tạo một chương trình nhỏ cho Rails bao gồm một số phương pháp của tôi mà tôi đã xây dựng bên trong mô-đun bên trong mô-đun ApplicationHelper. Dưới đây là một ví dụ:Tạo mô-đun kế thừa từ mô-đun khác trong Ruby

module Helper 
    def time 
     Time.now.year 
    end 
end 

module ApplicationHelper 
    # Inherit from Helper here... 
end 

Tôi biết rằng ApplicationHelper < Helperinclude Helper sẽ làm việc trong bối cảnh của một lớp, nhưng những gì bạn sẽ sử dụng cho kế thừa mô-đun-to-mô-đun? Cảm ơn.

Trả lời

22

Trong thực tế, bạn có thể xác định mô-đun bên trong mô-đun khác, sau đó bao gồm trong phạm vi bên ngoài.

so ross$ cat >> mods.rb 
module ApplicationHelper 
    module Helper 
    def time 
     Time.now.year 
    end 
    end 
    include Helper 
end 

class Test 
    include ApplicationHelper 
    def run 
    p time 
    end 
    self 
end.new.run 
so ross$ ruby mods.rb 
2012 
+0

Tôi chưa bao giờ nghĩ đến việc sử dụng mô-đun bên trong một phương thức khác, nhờ sự trợ giúp! – beakr

+7

Tôi không chắc chắn những gì khai báo Helper bên trong ApplicationHelper, trừ việc ẩn nó khỏi mã toàn cục. Điều quan trọng là 'include' (và 'extend') làm việc cho các module cũng như các lớp. –

1

Một lưu ý tiềm năng là nếu mô-đun đi kèm đính kèm phương pháp lớp, thì các phương pháp đó có thể được đính kèm với đối tượng sai.

Trong một số trường hợp, có thể an toàn hơn để bao gồm mô-đun 'cha mẹ' trực tiếp trên lớp cơ sở, sau đó bao gồm một mô-đun khác bằng các phương pháp mới. ví dụ.

module ApplicationHelper 
    def self.included(base) 
    base.class_eval do 
     include Helper 
     include InstanceMethods 
    end 
    end 

    module InstanceMethods 
    def new_method 
     #.. 
    end 
    end 

end 

Các phương pháp mới không được định nghĩa trực tiếp trong ApplicationHelper như include Helper sẽ được chạy sau khi định nghĩa phương pháp, khiến chúng được ghi đè bởi Helper. Người ta có thể định nghĩa phương pháp bên trong khối class_eval

+0

Ở đây bạn có các câu lệnh include bên trong định nghĩa phương thức của bạn, đây có thể không phải là cách đúng để thực hiện nó ... Đây là một cảnh báo tốt chống lại việc viết bao gồm các định nghĩa phương thức bên trong. Bao gồm phải ở bên ngoài định nghĩa phương thức như trong câu trả lời của DigitalRoss – emery

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