[ruby-on-rails] Ruby에서 객체의 모든 메소드를 나열하는 방법은 무엇입니까?

특정 개체가 액세스 할 수있는 모든 메서드를 어떻게 나열합니까?

@current_user응용 프로그램 컨트롤러에 정의 된 개체 가 있습니다 .

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

보기 파일에서 내가 사용할 수있는 방법을보고 싶습니다. 특히, :has_many협회가 제공 하는 방법을보고 싶습니다 . (무엇 :has_many 제공 해야하는지 알고 있지만 확인하고 싶습니다.)



답변

다음은 기본 Object 클래스에없는 User 클래스의 메서드 목록입니다.

>> 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", ...

참고 methods클래스 및 클래스 인스턴스에 대한 방법입니다.

다음은 ActiveRecord 기본 클래스에없는 User 클래스의 메서드입니다.

>> 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.

사용자 클래스에 정의 된 (많은) has_many 관계의 결과로 생성 된 방법을 참고 하지 의 결과에methods 호출 .

추가됨 : has_many는 메소드를 직접 추가하지 않습니다. 대신 ActiveRecord 기계는 Ruby method_missingresponds_to기술을 사용하여 즉시 메서드 호출을 처리합니다. 결과적으로 메서드는 methods메서드 결과에 나열되지 않습니다 .


답변

모듈 #instance_methods

수신자의 공용 및 보호 된 인스턴스 메서드의 이름을 포함하는 배열을 반환합니다. 모듈의 경우 이는 공용 및 보호 된 메소드입니다. 클래스의 경우 인스턴스 (단일 항목이 아님) 메서드입니다. 인수가 없거나 거짓 인 인수를 사용하면 mod의 인스턴스 메서드가 반환되고, 그렇지 않으면 mod 및 mod의 수퍼 클래스에있는 메서드가 반환됩니다.

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


답변

또는 User.methods(false)해당 클래스 내에 정의 된 메서드 만 반환합니다.


답변

넌 할 수있어

current_user.methods

더 나은 목록을 위해

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


답변

이 중 하나는 어떻습니까?

object.methods.sort
Class.methods.sort


답변

사용자 has_many 게시물이 있다고 가정합니다.

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


답변

@clyfe의 대답을 설명합니다. 다음 코드를 사용하여 인스턴스 메소드 목록을 가져올 수 있습니다 ( “Parser”라는 객체 클래스가 있다고 가정).

Parser.new.methods - Object.new.methods