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?


112

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?

Tôi có một @current_userđối tượng, được xác định trong bộ đ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 phương pháp nào tôi có sẵn cho tôi trong tệp xem. Cụ thể, tôi muốn xem những phương pháp nào mà một :has_manyhiệp hội cung cấp. (Tôi biết những gì :has_many nên cung cấp, nhưng muốn kiểm tra điều đó.)


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

@Dirk, chào mừng bạn đến với stackoverflow! Nhớ "kiểm tra" câu trả lời trả lời đúng nhất câu hỏi của bạn. Cũng ủng hộ bất kỳ câu trả lời nào, cho bất kỳ câu hỏi nào mà bạn thấy hữu ích / hữu ích.
Larry K

Câu trả lời:


209

Sau đây sẽ liệt kê các phương thức mà lớp Người dùng có mà lớp Đối tượng cơ sở 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 đó methodslà một phương thức cho Lớp và cho các cá thể Lớp.

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

>> 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 các phương thức được tạo là kết quả của (nhiều) mối quan hệ has_many được định nghĩa trong lớp Người dùng không nằm trong kết quả củamethods cuộc gọi.

Đã 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 Ruby method_missingvà các responds_tokỹ thuật để xử lý các lệnh gọi phương thức một cách nhanh chóng. Do đó, các phương thức không được liệt kê trong methodskết quả phương thức.


2
Mặc dù có thể không trọn vẹn vì một số phương pháp chỉ được tạo ra khi method_missing được gọi (ví dụ Finders động)
Frederick Cheung

nếu tôi thử response_to? Tôi gặp lỗi thiếu phương thức. Tôi đang chạy ứng dụng này bên trong application.html.erb
Dirk

@Dirk - có thể phương thức này không có sẵn ... Tôi khuyên bạn nên gửi một câu hỏi mới để hiển thị định nghĩa Lớp AR của bạn là gì và sau đó hỏi về các phương pháp cụ thể mà bạn nghĩ: has_many nên cung cấp. Ngoài ra, bạn có kết hợp: thuộc_to? Vốn và pluralization quy tắc Rails cho AR đã khiến cho nhiều lạc lối ...
Larry K

@Larry. Cảm ơn - Tôi có thể lấy danh sách bằng .to_yaml. Nó trông như thế này: --- -: sketch -: sketch_ids -: sketch = -: sketch_ids = -: before_add_for_sketches -: before_add_for_sketches? <nhiều bị bỏ qua> ........ làm cách nào để truy cập các phương thức đó? (trỏ tôi đến tài liệu được đánh giá cao quá :)
Dirk

Tài liệu cho: has_many hiển thị nhiều phương thức được thêm vào. Những cái khác là mới cho các phiên bản sau của Rails. Chúng bao gồm "before_add_for", v.v. Chúng là "Hiệp hội gọi lại" - hãy xem phần đó của tài liệu
Larry K

9

Mô-đun # instance_methods

Trả về một mảng chứa tên của các phương thức đối tượng công khai và được bảo vệ trong bộ thu. Đối với một mô-đun, đây là các phương thức công khai 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 có đối số sai, các phương thức thể hiện trong mod được trả về, nếu không thì các phương thức trong các lớp cha của mod và mod đượ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

6

Hoặc chỉ User.methods(false)để trả về các phương thức được định nghĩa trong lớp đó.


4

Bạn có thể làm

current_user.methods

Để có danh sách tốt hơn

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


1

Giả sử Người dùng có_many Bài đăng:

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

1

Để hiểu rõ câu trả lời của @ clyfe. Bạn có thể nhận được danh sách các phương thức phiên bản của mình bằng cách sử dụng mã sau (giả sử rằng bạn có Lớp đối tượng có tên "Trình phân tích cú pháp"):

Parser.new.methods - Object.new.methods

1

Nếu Bạn đang tìm danh sách các phương thức phản hồi bởi một phiên bản (trong trường hợp của bạn là @current_user). Theo phương pháp tài liệu ruby

Trả về danh sách tên của các phương thức công khai 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à false, nó trả về một mảng các phương thức singleton công khai 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 xem một phương thức có thể gọi được trên 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 của lớp cha thì chỉ cần trừ các phương thức của lớp cha khỏi nó.

@current_user.methods - @current_user.class.superclass.new.methods #methods that are available to @current_user instance.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.