Comment lister toutes les méthodes pour un objet dans Ruby?
Comment lister toutes les méthodes auxquelles un objet particulier a accès?
J'ai un objet @current_user
, défini dans le contrôleur d'application:
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
Et je veux voir quelles méthodes j'ai à ma disposition dans le fichier de vue. Plus précisément, je veux voir quelles méthodes une association :has_many
fournit. (Je sais quoi :has_many
devrait fournir, mais veulent vérifier cela.)
8 réponses
Ce qui suit listera les méthodes que la classe Utilisateur a que la classe D'objet de base n'a pas...
>> 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", ...
Notez que methods
est une méthode pour les classes et pour les instances de classe.
Voici les méthodes que ma classe Utilisateur a qui ne sont pas dans la classe de base ActiveRecord:
>> 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.
Notez que les méthodes créées à la suite des relations has_many (many) définies dans la classe User sont et non dans les résultats de l'appel methods
.
Ajouté Notez que: has_many n'ajoute pas de méthodes directement. Au lieu de cela, les machines ActiveRecord utilisent les techniques Ruby method_missing
et responds_to
pour gérer les appels de méthode à la volée. Par conséquent, les méthodes ne sont pas répertoriées dans le résultat de la méthode methods
.
Renvoie un tableau contenant les noms des méthodes d'instance publique et protégée dans le récepteur. Pour un module, ce sont les méthodes publiques et protégées; pour une classe, ce sont les méthodes instance (pas singleton). Sans argument, ou avec un argument qui est false, les méthodes d'instance dans mod sont retournées, sinon les méthodes dans MOD et les superclasses de mod sont retournées.
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
Vous pouvez faire
current_user.methods
Pour une meilleure liste
puts "\n\current_user.methods : "+ current_user.methods.sort.join("\n").to_s+"\n\n"
Qu'en est-il d'un de ceux-ci?
object.methods.sort
Class.methods.sort
Supposons que L'utilisateur has_many Messages:
u = User.first
u.posts.methods
u.posts.methods - Object.methods
Pour exposer la réponse de @ clyfe. Vous pouvez obtenir une liste de vos méthodes d'instance en utilisant le code suivant (en supposant que vous avez une classe D'objets nommée "Parser"):
Parser.new.methods - Object.new.methods
Si vous cherchez une liste de méthodes qui répondent par une instance (dans votre cas @current_user). Selon la documentation ruby méthodes
Renvoie une liste des noms des méthodes publiques et protégées de obj. Cela inclura toutes les méthodes accessibles dans les ancêtres d'obj. Si le paramètre optionnel est false, il renvoie un tableau d'obj les méthodes singleton publiques et protégées, le tableau n'inclura pas méthodes dans les modules inclus dans 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.
Alternativement, Vous pouvez également vérifier qu'une méthode est appelable sur un objet ou pas?.
@current_user.respond_to?:your_method_name
Si vous ne voulez pas de méthodes de classe parent, soustrayez-en simplement les méthodes de classe parent.
@current_user.methods - @current_user.class.superclass.new.methods #methods that are available to @current_user instance.
Ou simplement User.methods(false)
pour retourner uniquement les méthodes définies dans cette classe.