Как перечислить все методы для объекта в Ruby? - PullRequest
94 голосов
/ 21 декабря 2011

Как мне перечислить все методы, к которым у определенного объекта есть доступ?

У меня есть объект @current_user, определенный в контроллере приложения:

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

И хочу посмотреть, какие методы у меня есть в файле просмотра. В частности, я хочу посмотреть, какие методы обеспечивает ассоциация :has_many. (Я знаю, что :has_many должен предоставить, но хочу это проверить.)

Ответы [ 8 ]

180 голосов
/ 21 декабря 2011

Ниже перечислены методы класса User, которых у базового класса Object нет ...

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

Обратите внимание, что methods - это метод для классов и экземпляров класса.

Вот методы, которые есть в моем классе User, которых нет в базовом классе 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.

Обратите внимание, что методы, созданные в результате (многих) отношений has_many, определенных вПользовательские классы не в результатах вызова methods.

Добавлено Обратите внимание: has_many не добавляет методы напрямую.Вместо этого механизм ActiveRecord использует методы Ruby method_missing и responds_to для обработки вызовов методов на лету.В результате методы не перечислены в результате метода methods.

9 голосов
/ 21 декабря 2011

Модуль # instance_methods

Возвращает массив, содержащий имена открытых и защищенных методов экземпляра в приемнике.Для модуля это публичные и защищенные методы;для класса они являются экземплярами (а не одноэлементными) методами.Без аргумента или с ложным аргументом возвращаются методы экземпляра в моде, в противном случае возвращаются методы в суперклассах мода и мода.

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
5 голосов
/ 12 сентября 2018

Или просто User.methods(false), чтобы вернуть только методы, определенные в этом классе.

4 голосов
/ 21 декабря 2011

Вы можете сделать

current_user.methods

Для лучшего списка

puts "\n\current_user.methods : "+ current_user.methods.sort.join("\n").to_s+"\n\n"
3 голосов
/ 21 декабря 2011

А как насчет одного из них?

object.methods.sort
Class.methods.sort
1 голос
/ 06 июня 2017

Если вы смотрите список методов, которые отвечают экземпляром (в вашем случае @current_user).Согласно документации ruby ​​ методы

Возвращает список имен открытых и защищенных методов объекта obj.Это будет включать в себя все методы, доступные в предках obj.Если необязательный параметр имеет значение false, он возвращает массив открытых и защищенных одноэлементных методов объекта obj, в этот массив не будут включены методы модулей, включенных в объект 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.

В качестве альтернативы, вы также можете проверить, чтометод вызывается на объекте или нет?

@current_user.respond_to?:your_method_name

Если вам не нужны методы родительского класса, просто вычтите из него методы родительского класса.

@current_user.methods - @current_user.class.superclass.new.methods #methods that are available to @current_user instance.
1 голос
/ 17 мая 2017

Изложить на ответ @ clyfe. Вы можете получить список методов вашего экземпляра, используя следующий код (при условии, что у вас есть класс объектов с именем «Parser»):

Parser.new.methods - Object.new.methods
1 голос
/ 21 декабря 2011

Предположим, пользователь has_many Сообщений:

u = User.first
u.posts.methods
u.posts.methods - Object.methods
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...