2011-12-21 22 views
72

Làm cách nào để liệt kê tất cả các phương thức mà một đối tượng cụ thể có quyền truy cập?Làm thế nào để liệt kê tất cả các phương thức cho một đối tượng trong Ruby?

Tôi có một đối tượng @current_user, quy định tại các điều khiển ứng dụng:

def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
end 

Và muốn xem những gì các phương pháp tôi có sẵn cho tôi trong file xem. Cụ thể, tôi muốn xem những phương thức mà hiệp hội :has_many cung cấp. (Tôi biết những gì :has_manynên cung cấp, nhưng muốn kiểm tra xem.)

+0

Để làm rõ, bạn muốn các phương thức có thể gọi trên '@ current_user'? –

+0

@Dirk, chào mừng bạn đến với stackoverflow! Hãy nhớ "kiểm tra" câu trả lời phù hợp nhất với câu hỏi của bạn. Cũng upvote bất kỳ câu trả lời, cho bất kỳ câu hỏi, mà bạn tìm thấy hữu ích/hữu ích. –

Trả lời

141

Sau đây sẽ liệt kê các phương pháp mà lớp người dùng có các lớp cơ sở Object không có ...

>> User.methods - Object.methods 
=> ["field_types", "maximum", "create!", "active_connections", "to_dropdown", 
    "content_columns", "su_pw?", "default_timezone", "encode_quoted_value", 
    "reloadable?", "update", "reset_sequence_name", "default_timezone=", 
    "validate_find_options", "find_on_conditions_without_deprecation", 
    "validates_size_of", "execute_simple_calculation", "attr_protected", 
    "reflections", "table_name_prefix", ... 

Lưu ý rằng methods là một phương thức cho Lớp và cho các phiên bản Lớp.

Dưới đây là các phương pháp mà lớp người dùng của tôi có mà không phải là trong lớp ActiveRecord cơ sở:

>> User.methods - ActiveRecord::Base.methods 
=> ["field_types", "su_pw?", "set_login_attr", "create_user_and_conf_user", 
    "original_table_name", "field_type", "authenticate", "set_default_order", 
    "id_name?", "id_name_column", "original_locking_column", "default_order", 
    "subclass_associations", ... 
# I ran the statements in the console. 

Lưu ý rằng phương pháp tạo ra như là kết quả của (nhiều) mối quan hệ has_many định nghĩa trong lớp người dùng là không phải trong kết quả cuộc gọi methods.

Đã thêm Lưu ý rằng: has_many không thêm phương thức trực tiếp. Thay vào đó, máy ActiveRecord sử dụng các kỹ thuật Ruby method_missingresponds_to để xử lý các cuộc gọi phương thức khi đang di chuyển. Do đó, các phương thức không được liệt kê trong kết quả phương pháp methods.

+1

hmm? "a" .methods hoạt động tốt. – steenslag

+2

Mặc dù điều đó có thể không hoàn chỉnh vì một số phương thức chỉ được tạo khi method_missing được gọi (ví dụ: công cụ tìm động) –

+1

@steenslag - chính xác. Tôi xấu. Đã sửa. –

3

Điều gì về một trong số này?

object.methods.sort 
Class.methods.sort 
8

Module#instance_methods

Trả về một mảng chứa tên của các phương pháp dụ công cộng và bảo vệ trong máy thu. Đối với một mô-đun, đây là những phương thức công cộng và được bảo vệ; đối với một lớp, chúng là các phương thức instance (không phải singleton). Không có đối số, hoặc với một đối số sai, các phương thức thể hiện trong mod được trả về, nếu không các phương thức trong các siêu lớp của mod và mod sẽ được trả về.

module A 
    def method1() end 
end 
class B 
    def method2() end 
end 
class C < B 
    def method3() end 
end 

A.instance_methods    #=> [:method1] 
B.instance_methods(false)   #=> [:method2] 
C.instance_methods(false)   #=> [:method3] 
C.instance_methods(true).length #=> 43 
4

Bạn có thể làm

current_user.methods 

Đối với niêm yết tốt hơn

puts "\n\current_user.methods : "+ current_user.methods.sort.join("\n").to_s+"\n\n" 
1

Giả sử tài has_many bài:

u = User.first 
u.posts.methods 
u.posts.methods - Object.methods 
1

Để expound khi answe @ clyfe của r. Bạn có thể nhận được một danh sách các phương pháp dụ của bạn bằng cách sử dụng đoạn mã sau (giả sử rằng bạn có một lớp đối tượng có tên là "Parser"):

Parser.new.methods - Object.new.methods 
1

Nếu bạn đang tìm kiếm danh sách các phương pháp mà đáp ứng bởi một thể hiện (trong trường hợp của bạn @người dùng hiện tại).Theo tài liệu về ruby ​​methods

Trả về danh sách các phương pháp công cộng và được bảo vệ của obj. Điều này sẽ bao gồm tất cả các phương thức có thể truy cập trong tổ tiên của obj. Nếu tham số tùy chọn là sai, nó trả về một mảng các phương thức singleton công cộng và được bảo vệ của obj, mảng sẽ không bao gồm các phương thức trong các mô-đun có trong obj.

@current_user.methods 
@current_user.methods(false) #only public and protected singleton methods and also array will not include methods in modules included in @current_user class or parent of it. 

Ngoài ra, Bạn cũng có thể kiểm tra một phương pháp là callable vào một đối tượng hay không ?.

@current_user.respond_to?:your_method_name 

Nếu bạn không muốn các phương thức lớp cha thì chỉ trừ các phương thức lớp gốc.

@current_user.methods - @current_user.class.superclass.new.methods #methods that are available to @current_user instance. 
Các vấn đề liên quan