2011-12-21 17 views
72

¿Cómo enumero todos los métodos a los que tiene acceso un objeto en particular?¿Cómo enumerar todos los métodos para un objeto en Ruby?

que tienen un objeto @current_user, definido en el controlador de aplicación:

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

y quieren ver qué métodos que tengo a mi disposición en el archivo de vista. Específicamente, quiero ver qué métodos proporciona una asociación :has_many. (Sé lo :has_many debe proporcionar, pero que desee comprobar eso.)

+0

Para aclarar, ¿desea los métodos invocables en '@ current_user'? –

+0

@Dirk, bienvenido a stackoverflow! Recuerde "verificar" la respuesta que mejor responde a su pregunta. También vota cualquier respuesta, a cualquier pregunta, que encuentres útil/útil. –

Respuesta

141

A continuación se mencionan los métodos que la clase usuario tiene que la clase de objeto de base no tiene ...

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

Tenga en cuenta que methods es un método para Clases y para instancias de clase.

He aquí los métodos que mi clase de usuario tiene que no están en la clase 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. 

Tenga en cuenta que los métodos creados como resultado de las (muchas) relaciones has_many definidos en la clase de usuario se no en los resultados de la llamada methods.

Agregado Tenga en cuenta que: has_many no agrega métodos directamente. En cambio, la maquinaria ActiveRecord usa las técnicas Ruby method_missing y responds_to para manejar llamadas de método sobre la marcha. Como resultado, los métodos no se enumeran en el resultado del método methods.

+1

hmm? "a" .methods funciona bien. – steenslag

+2

Aunque eso puede no ser completo ya que algunos métodos solo se crean cuando se llama a method_missing (por ejemplo, buscadores dinámicos) –

+1

@steenslag - correcto. Yo mal. Fijo. –

3

¿Qué tal uno de estos?

object.methods.sort 
Class.methods.sort 
8

Module#instance_methods

Devuelve una matriz que contiene los nombres de los métodos de instancia públicas y protegidas en el receptor. Para un módulo, estos son los métodos públicos y protegidos; para una clase, son los métodos de instancia (no solo). Sin argumentos, o con un argumento que es falso, se devuelven los métodos de instancia en mod, de lo contrario, se devuelven los métodos en las superclases de mod y 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

Usted puede hacer

current_user.methods 

Para una mejor lista

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

Supongamos has_many usuario Mensajes:

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

exponer sobre answe @ de clyfe r. Usted puede obtener una lista de los métodos de instancia utilizando el siguiente código (asumiendo que tiene una clase de objeto llamado "Analizador"):

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

Si usted está lista de métodos que responden por una instancia (en su caso busca @usuario actual).De acuerdo con la documentación de ruby ​​methods

Devuelve una lista de los nombres de los métodos públicos y protegidos de obj. Esto incluirá todos los métodos accesibles en los antepasados ​​de obj. Si el parámetro opcional es falso, devuelve una matriz de obj público y métodos singleton protegidos, la matriz no incluirá los métodos en los módulos incluidos en 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. 

Como alternativa, también puede comprobar que un método es exigible en un objeto o no ?.

@current_user.respond_to?:your_method_name 

Si no desea los métodos de la clase padre, restar los métodos de la clase padre de ella.

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