2011-04-13 42 views
15

我有兩個型號,列出對象respond_to的所有方法?

User 
Membership 

兩個有一個下列關係的其他

user has_many :memberships 

我一直在試圖找出其中的生成方法所在,以及如何獲得它在實例的方法列表中。這裏是調試器的輸出顯示我的delima

(rdb:63) @user.memberships.respond_to?"build" 
true 

雖然以下是返回false,不應該它返回true?

(rdb:63) @user.memberships.instance_methods.include?"build" 
false 
+0

您將無法在列表中看到「構建」,它可能是使用'method_missing' – 2011-04-13 16:32:54

+0

生成的。是否有無法檢查此method_missing實現?我想找到這個工作的根源 – 2011-04-14 05:45:45

+0

是的,嘗試運行這個: User.new.memberships.method_missing(:build) 你應該看到異常,說被調用的保護方法'build'那麼你可以嘗試遵循它。但是這需要一些時間 – 2011-04-14 06:08:07

回答

9

的一點是,instance_methods帶有一個可選的布爾參數,表示你是否希望看到的情況祖先的方法。在你的情況下,我想你想instance_methods(true)

但是,根據the documentation,似乎「build」是自動生成的方法。通常,ActiveRecord中的自動生成方法通過覆蓋method_missing並處理對實際不存在的「方法」的調用來實現。 responds_to也被覆蓋,以便該類將指示它響應正確的調用。但是,由於這些「方法」實際上沒有定義,所以它們不會顯示在instance_methods列表中。

由於類respond_to使用method_missing的命令列表本質上是無限的,我敢肯定沒有辦法獲取列表。例如,具有屬性a,b,c和d的ActiveRecord模型將自動響應諸如find_by_a_and_bfind_by_a_b_and_cfind_by_b_and_d等等的調用,並且無限次地進行響應。沒有辦法得到所有這些可能性的清單。

+0

沒有工作。 (rdb:63)@ user.memberships.class.instance_methods(true).include?「build」 false (rdb:63)@附加輸出(我也嘗試在類上調用它,而不是每個Simone的建議的實例) user.memberships.instance_methods(true).include?「build」 false – 2011-04-13 16:21:35

5

你可以嘗試:

@user = User.first 

@user.methods.grep /method_name/ 

不過,我不認爲你會看到「構建」或列表中的「創建」。很可能這些方法是動態生成的

5

請注意instance_methods根據Ruby版本返回一個String或Symbol數組。

Ruby 1.8返回一個字符串數組,Ruby 1.9是一個Symbol數組。

在Ruby 1.8

"".respond_to?(:upcase) 
# => true 
"".class.instance_methods.include?("upcase") 
# => false 
"".class.instance_methods.include?(:upcase) 
# => false 

在Ruby 1.9

"".respond_to?(:upcase) 
# => true 
"".class.instance_methods.include?("upcase") 
# => false 
"".class.instance_methods.include?(:upcase) 
# => true 

此外,instance_methods必須調用的類,而不是實例。

+0

Didnt work(rdb:63)@ user.memberships.instance_methods(true).include?(:build) false (rdb:63)@user .memberships.class.instance_methods(true).include?(:build) false – 2011-04-13 16:22:53

相關問題