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_many
sollte angeben, möchte dies aber überprüfen.)
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 methods
nicht 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.
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
Oder einfach User.methods(false)
, um nur die in dieser Klasse definierten Methoden zurückzugeben.
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"
Was ist mit einer davon?
object.methods.sort
Class.methods.sort
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.
Angenommen, Benutzer has_many Beiträge:
u = User.first
u.posts.methods
u.posts.methods - Object.methods
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