web-dev-qa-db-de.com

Wie liste ich alle Methoden für ein Objekt in Ruby auf?

Wie liste ich alle Methoden auf, auf die ein bestimmtes Objekt Zugriff hat?

Ich habe ein @current_user Objekt, definiert im Anwendungscontroller:

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

Und möchten sehen, welche Methoden mir in der Ansichtsdatei zur Verfügung stehen. Insbesondere möchte ich sehen, welche Methoden ein :has_many Verein bietet. (Ich weiß was :has_manysollte angeben, möchte dies aber überprüfen.)

98
Dirk

Im Folgenden werden die Methoden aufgelistet, über die die Benutzerklasse verfügt, über die die Basisobjektklasse nicht verfügt.

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

Beachten Sie, dass methods eine Methode für Klassen und Klasseninstanzen ist.

Hier sind die Methoden meiner Benutzerklasse, die nicht in der ActiveRecord-Basisklasse enthalten sind:

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

Beachten Sie, dass die Methoden, die als Ergebnis der in der Benutzerklasse definierten (vielen) has_many-Beziehungen erstellt wurden, in den Ergebnissen des Aufrufs methodsnicht sind.

Hinzugefügt Beachten Sie, dass: has_many keine Methoden direkt hinzufügt. Stattdessen verwendet der ActiveRecord-Computer die Zeichenfolge Ruby method_missing und responds_to Techniken zur schnellen Bearbeitung von Methodenaufrufen. Infolgedessen werden die Methoden nicht im Ergebnis der Methode methods aufgeführt.

184
Larry K

Modul # instance_methods

Gibt ein Array zurück, das die Namen der öffentlichen und geschützten Instanzmethoden im Empfänger enthält. Für ein Modul sind dies die öffentlichen und geschützten Methoden. Für eine Klasse sind dies die Instanzmethoden (keine Singleton-Methoden). Ohne Argument oder mit einem Argument, das falsch ist, werden die Instanzmethoden in mod zurückgegeben, andernfalls werden die Methoden in den Superklassen von mod und mod zurückgegeben.

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
9
clyfe

Oder einfach User.methods(false), um nur die in dieser Klasse definierten Methoden zurückzugeben.

5
Ruto Collins

Du kannst tun

current_user.methods

Für eine bessere Auflistung

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

Was ist mit einer davon?

object.methods.sort
Class.methods.sort
3

Wenn Sie eine Liste von Methoden suchen, die von einer Instanz antworten (in Ihrem Fall @current_user). Laut Ruby Dokumentation Methoden

Gibt eine Liste der Namen der öffentlichen und geschützten Methoden von obj zurück. Dies schließt alle Methoden ein, auf die in den Vorfahren von obj zugegriffen werden kann. Wenn der optionale Parameter false ist, gibt er ein Array der öffentlichen und geschützten Singleton-Methoden von obj zurück. Das Array enthält keine Methoden in Modulen, die in obj enthalten sind.

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

Alternativ können Sie auch prüfen, ob eine Methode für ein Objekt aufrufbar ist oder nicht.

@current_user.respond_to?:your_method_name

Wenn Sie keine übergeordneten Klassenmethoden möchten, subtrahieren Sie einfach die übergeordneten Klassenmethoden.

@current_user.methods - @current_user.class.superclass.new.methods #methods that are available to @current_user instance.
1

Angenommen, Benutzer has_many Beiträge:

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

Um die Antwort von @ clyfe zu erläutern. Mit dem folgenden Code können Sie eine Liste Ihrer Instanzmethoden abrufen (vorausgesetzt, Sie haben eine Objektklasse mit dem Namen "Parser"):

Parser.new.methods - Object.new.methods
1
Jared Menard