Rubyでオブジェクトのすべてのメソッドをリストする方法は?


112

特定のオブジェクトがアクセスできるすべてのメソッドをリストするにはどうすればよいですか?

@current_userアプリケーションコントローラーで定義されたオブジェクトがあります。

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

また、ビューファイルで使用できるメソッドを確認したい。具体的には、:has_many関連付けが提供するメソッドを確認します。(私は何:has_many 提供すべきか知っていますが、それを確認したいと思います。)


明確にするために、メソッドを呼び出し可能にする必要があります@current_userか?
アンドリューマーシャル

@ Dirk、stackoverflowへようこそ!質問に最もよく答える回答を「確認」することを忘れないでください。また、役立つ質問や役立つ質問への回答にも賛成票を投じてください。
ラリーK

回答:


209

以下は、基本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.

Userクラスで定義された(多くの)has_many関係の結果として作成されたメソッドは、呼び出しの結果には含まないことに注意してくださいmethods

追加しました has_manyの直接メソッドを追加しませんので注意してください。代わりに、ActiveRecord機構はRuby method_missingresponds_toテクニックを使用して、メソッド呼び出しをその場で処理します。その結果、メソッドはmethodsメソッド結果にリストされません。


2
一部のメソッドはmethod_missingが呼び出されたときにのみ作成されるため(たとえば、動的ファインダー)、それは完全ではないかもしれません
Frederick Cheung

私がresponds_toを試してみると?メソッド不足エラーが発生します。私はapplication.html.erb内でこれを実行しています
Dirk

@Dirk-メソッドが存在しない可能性があります... ARクラス定義が何であるかを示す新しい質問を提出し、:has_manyが提供する必要があると思われる特定のメソッドについて質問することをお勧めします。また、一致する:belongs_toはありますか?RailsのARの大文字化と複数化の規則により、多くの誤解が生じています...
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

Module#instance_methods

レシーバーのパブリックおよび保護されたインスタンスメソッドの名前を含む配列を返します。モジュールの場合、これらはpublicおよびprotectedメソッドです。クラスの場合、これらはインスタンス(シングルトンではない)メソッドです。引数がない場合、または引数がfalseの場合は、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





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.