2009-11-28 31 views
15

Làm thế nào tôi có thể nhận được từ một mô-đun tên lớp của lớp mô-đun được bao gồm?Lấy tên lớp học từ một mô-đun

module ActMethods 
    def some_method(*attr_names) 
    cls = self.class # this doesn't work 
    end 
end 

Làm cách nào để chuyển sang biến cls tên của lớp học với mô-đun này được tải?

+0

Nên hoạt động! Có thể bạn cần self.class.name – khelll

+0

Lưu ý rằng nếu lớp được mở rộng trong ẩn danh, sau đó in ra self.class hoặc self.class.name trả về trống, điều này có thể gây nhầm lẫn. Trường hợp này, bạn cũng nên kiểm tra self.class.superclass. –

+0

'self.class' không hoạt động đối với tôi. 'self.class.name' trả về" Module ". Tôi nghĩ rằng nó đã làm với thực tế là các lớp học trong đó mô-đun của tôi được bao gồm thừa kế từ ActiveRecord :: Base (Rails 3.2.8) nhưng tôi không chắc chắn tại sao hoặc làm thế nào đó là can thiệp. –

Trả lời

9

self.class sẽ đưa bạn đến lớp của đối tượng mà phương thức được gọi. Giả sử mô-đun được đưa vào một lớp, đây là lớp bao gồm mô-đun hoặc lớp con của mô-đun đó. Nếu bạn thực sự chỉ muốn tên, bạn có thể sử dụng self.class.name để thay thế.

Nếu bạn mở rộng một lớp học với mô-đun và bạn muốn học lớp đó, bạn chỉ có thể làm cls = self (hoặc cls = name nếu bạn muốn tên của lớp đó làm chuỗi).

Nếu không có điều nào ở trên hữu ích, bạn nên làm rõ những gì bạn muốn.

1

Làm việc cho tôi. Như sepp nói bạn phải bao gồm nó để nó hoạt động.

module ActMethods 
    def some_method(*attr_names) 
    cls = self.class # this doesn't work 
    puts cls 
    end 
end 

class Boh 
    include ActMethods 
end 

b = Boh.new 
b.some_method 
6

nếu self không phải là một lựa chọn cho một số lý do, thay thế có thể là ancestorshttp://ruby-doc.org/core-2.0/Module.html#method-i-ancestors

# rails concern example: 

module Foo 
    extend ActiveSupport::Concern 

    included do 
    p "Wooo hoo, it's #{top_ancestor_class}" 
    end 

    module ClassMethods 
    def top_ancestor_class 
     ancestors.first 
    end 
    end 
end 

class Event < ActiveRecord::Base 
    include Foo 
end 

#=> Woo hoo, it's Event(....) 
+0

BTW biết thêm thông tin trong bài viết của tôi http://www.eq8.eu/blogs/13-ruby-ancestors-descendants- và-khác-gây phiền nhiễu-người thân – equivalent8

1

PS: Đối với trường hợp câu trả lời chung, xem câu trả lời sepp2k của.

Nếu bạn chỉ bao gồm mô-đun trong bộ điều khiển, bạn có thể muốn xem xét sử dụng controller_name.classify để lấy tên của mô hình tương ứng. Ví dụ:

>> ArticlesController.controller_name.classify 
=> "Article" 

Từ đó bạn có thể nhận được lớp thực tế (nếu bạn muốn), bằng cách gọi .constantize trên kết quả.

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