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


113

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

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

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

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


명확히하기 위해, 당신은 @current_user?
Andrew Marshall

@Dirk, stackoverflow에 오신 것을 환영합니다! 귀하의 질문에 가장 적합한 답변을 "확인"하십시오. 또한 유용하거나 도움이되는 질문에 대한 답변을 찬성합니다.
Larry K

답변:


211

다음은 기본 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메서드 결과에 나열되지 않습니다 .


2
몇 가지 방법 만 생성되기 때문에 method_missing은 (예를 들어, 동적 측정기)를 호출 할 때 그것은 완전하지 않을 수 있지만
프레드릭 청

내가 responds_to를 시도하면? 메서드 누락 오류가 발생합니다. 나는 이것을 application.html.erb 내부에서 실행하고있다
Dirk

@Dirk-아마도 방법이 없을 수도 있습니다 ... AR 클래스 정의가 무엇인지 보여주는 새로운 질문을 제출 한 다음 : has_many가 제공해야한다고 생각하는 특정 방법에 대해 질문하는 것이 좋습니다. 또한 일치하는 : belongs_to가 있습니까? AR에 대한 Rails의 대문자 및 복수화 규칙은 많은 사람들을 타락 시켰습니다 ...
Larry K

@ 래리. 감사합니다. .to_yaml로 목록을 가져올 수 있습니다. ----: sketches-: sketch_ids-: sketches =-: sketch_ids =-: before_add_for_sketches-: before_add_for_sketches? <많은 생략> ........ 이러한 메소드에 어떻게 액세스합니까? (문서를 가리키는 것도 감사합니다 :)
Dirk

문서 에 추가하는 방법 중 많은 has_many 쇼 :합니다. 다른 것들은 이후 버전의 Rails에 새로 추가되었습니다. 여기에는 "before_add_for"등이 포함됩니다. 이들은 "연관 콜백"입니다.이 부분을 참조하십시오. 문서
Larry K

9

모듈 #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

6

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


4

넌 할 수있어

current_user.methods

더 나은 목록을 위해

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


1

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

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

1

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

Parser.new.methods - Object.new.methods

1

인스턴스 (귀하의 경우 @current_user)에서 응답하는 메소드 목록을 찾고 있다면. 루비 문서화 방법에 따라

obj의 public 및 protected 메서드 이름 목록을 반환합니다. 여기에는 obj의 조상에서 액세스 할 수있는 모든 메서드가 포함됩니다. 선택적 매개 변수가 false이면 obj의 공용 및 보호 된 싱글 톤 메서드의 배열을 반환하며 배열은 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.

또는 메서드가 개체에서 호출 가능한지 여부를 확인할 수도 있습니다.

@current_user.respond_to?:your_method_name

부모 클래스 메서드를 원하지 않으면 부모 클래스 메서드를 빼십시오.

@current_user.methods - @current_user.class.superclass.new.methods #methods that are available to @current_user instance.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.