2011-12-21 5 views
72

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

私は、アプリケーションのコントローラで定義されて@current_userオブジェクト、持っている:

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

をそして、私は、ビューファイルで私に利用できる持っているものな方法見てみたいです。具体的には、:has_manyの関連付けがどのような方法で提供されているかを見たいと思います。 (私は提供すべきか:has_many知っているが、それを確認したい。)

+0

明確にするために、メソッドを '@ current_user'で呼び出し可能にしますか? –

+0

@Dirk、ようこそ、stackoverflowへ!質問に最もよく答える答えを「チェック」することを忘れないでください。また、どんな質問に対しても、あなたが役に立つ/役立つと感じる答えをすべてアップしてください。 –

答えて

141

以下は、Userクラスは、基本Objectクラスが持っていないことを持っているメソッドの一覧が表示されます...

>> 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はClassesおよびClassインスタンスのメソッドであることに注意してください。

>> 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の関係の結果として作成方法はをしていること:ここでは

はActiveRecordの基底クラスではありません、私のUserクラスが持つメソッドをですmethods呼び出しの結果ではではありません。

注:has_manyはメソッドを直接追加しません。代わりに、ActiveRecordマシンはRuby method_missingresponds_to技術を使用して、即座にメソッド呼び出しを処理します。その結果、メソッドはmethodsメソッドの結果にはリストされません。

+1

"a"メソッドはうまく機能します。 – steenslag

+2

method_missingが呼び出されたときにしか作成されないメソッドがいくつか存在するため、完全ではないかもしれません(例えば、動的ファインダ) –

+1

@steenslag - 正しいものです。私は悪いです。一定。 –

3

これらのいずれかについてはどうですか?

object.methods.sort 
Class.methods.sort 
8

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 
4

あなたはより良い物件

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

と仮定ユーザーhas_manyの投稿について

current_user.methods 

を行うことができます。

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

@のclyfeのanswe時に言えば、 r。あなたは、次のコードを使用して、インスタンスメソッドのリストを取得することができます(あなたは「パーサ」という名前のオブジェクトクラスを持っていると仮定して):

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

あなたはあなたのケースで(インスタンスによって応答するメソッドのリストを探しているなら@現在の使用者)。rubyのドキュメントによるとmethods

objのpublicおよびprotectedメソッドの名前のリストを返します。 これには、objの祖先でアクセス可能なすべてのメソッドが含まれます。 オプションのパラメータがfalseの場合、objの publicおよびprotectedシングルトンメソッドの配列を返します。配列には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. 
関連する問題