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

86
demandé sur halfer 2011-12-21 23:25:06

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.

164
répondu Larry K 2011-12-21 19:44:56

Module#instance_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
8
répondu clyfe 2011-12-21 19:30:56

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"
4
répondu Andreas Lyngstad 2011-12-21 19:33:36

Qu'en est-il d'un de ceux-ci?

object.methods.sort
Class.methods.sort
3
répondu Michael Frederick 2011-12-21 19:30:24

Supposons que L'utilisateur has_many Messages:

u = User.first
u.posts.methods
u.posts.methods - Object.methods
1
répondu maprihoda 2011-12-21 19:55:18

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
1
répondu Jared Menard 2017-05-16 23:01:19

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.
1
répondu Mukesh Kumar Gupta 2017-06-06 14:54:29

Ou simplement User.methods(false) pour retourner uniquement les méthodes définies dans cette classe.

1
répondu Ruto Collins 2018-09-12 18:12:09