列出对象respond_to的所有方法?

Sye*_*Ali 15 ruby ruby-on-rails

我有两个型号,

User 
Membership
Run Code Online (Sandbox Code Playgroud)

两者之间有以下关系

user has_many :memberships
Run Code Online (Sandbox Code Playgroud)

我一直试图找出构建方法所在的位置,以及如何在实例的方法列表中获取它.这是显示我的delima的调试器的输出

(rdb:63) @user.memberships.respond_to?"build"
true
Run Code Online (Sandbox Code Playgroud)

虽然以下是返回false,但它不会返回true?

(rdb:63) @user.memberships.instance_methods.include?"build"
false
Run Code Online (Sandbox Code Playgroud)

Jac*_*son 9

一点是instance_methods采用可选的布尔参数,指示是否要查看实例祖先的方法.在你的情况下,我认为你想要instance_methods(true).

但是,根据文档,似乎"构建"是一种自动生成的方法.通常,ActiveRecord中的自动生成方法是通过覆盖method_missing和处理对实际不存在的"方法"的调用来实现的. responds_to也被覆盖,以便类表明它响应正确的调用.但是,由于这些"方法"实际上并未定义,因此它们不会显示在instance_methods列表中.

由于类可以respond_to使用的命令列表method_missing基本上是无限的,我很确定没有办法获取列表.例如,具有一个ActiveRecord模型属性的a,b,c和d将自动将呼叫诸如响应find_by_a_and_bfind_by_a_b_and_cfind_by_b_and_d等等,循环往复.没有办法得到所有这些可能性的清单.


Vla*_*ich 5

你可以尝试:

@user = User.first

@user.methods.grep /method_name/
Run Code Online (Sandbox Code Playgroud)

但是,我不认为你会在列表中看到'build'或'create'.这些方法很可能是动态生成的


Sim*_*tti 5

请注意,instance_methods根据Ruby版本返回String或Symbol数组.

Ruby 1.8返回一个String数组,Ruby 1.9返回一个Symbol数组.

在Ruby 1.8中

"".respond_to?(:upcase)
# => true 
"".class.instance_methods.include?("upcase")
# => false
"".class.instance_methods.include?(:upcase)
# => false
Run Code Online (Sandbox Code Playgroud)

在Ruby 1.9中

"".respond_to?(:upcase)
# => true 
"".class.instance_methods.include?("upcase")
# => false
"".class.instance_methods.include?(:upcase)
# => true
Run Code Online (Sandbox Code Playgroud)

此外,instance_methods必须在类上调用,而不是在实例上调用.