如何列出特定对象有权访问的所有方法?
我有一个@current_user
对象,在应用程序控制器中定义:
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
想看看我在视图文件中可以使用哪些方法。具体来说,我想看看:has_many
关联提供了哪些方法。 (我知道:has_many
应提供什么,但想检查一下。)
答案 0 :(得分:179)
以下将列出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.
请注意,由于在methods
调用的结果中,用户类中定义的(多个)has_many关系而创建的方法不。
已添加请注意:has_many不会直接添加方法。相反,ActiveRecord机制使用Ruby method_missing
和responds_to
技术来动态处理方法调用。因此,这些方法未在methods
方法结果中列出。
答案 1 :(得分:9)
返回一个数组,其中包含接收器中public和protected实例方法的名称。对于模块,这些是公共和受保护的方法;对于一个类,它们是实例(而不是单例)方法。如果没有参数,或者参数为false,则返回mod中的实例方法,否则返回mod和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
答案 2 :(得分:5)
或者只是static void Main (string[] args)
{
int n;
do {
Console.Write ("Enter an integer : ");
} while(!int.TryParse(Console.ReadLine (), out n));
//int has been entered, now do something else...
}
仅返回该类中定义的方法。
答案 3 :(得分:4)
你可以做到
current_user.methods
为了更好的列表
puts "\n\current_user.methods : "+ current_user.methods.sort.join("\n").to_s+"\n\n"
答案 4 :(得分:3)
其中一个呢?
object.methods.sort
Class.methods.sort
答案 5 :(得分:1)
假设用户has_many帖子:
u = User.first
u.posts.methods
u.posts.methods - Object.methods
答案 6 :(得分:1)
阐述@ clyfe的回答。您可以使用以下代码获取实例方法的列表(假设您有一个名为&#34的对象类; Parser&#34;):
Parser.new.methods - Object.new.methods
答案 7 :(得分:1)
如果您正在查看按实例响应的方法列表(在您的情况下为@current_user)。根据ruby文档methods
返回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.