2011-12-21 43 views
72

如何列出特定對象有權訪問的所有方法?如何列出Ruby中所有對象的方法?

我有一個@current_user對象,在應用程序控制器定義:

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

,並希望看到什麼方法我在視圖文件必須提供給我。具體而言,我想查看一下:has_many關聯提供的方法。 (我知道:has_many應該提供,但需要檢查。)

+0

爲了澄清,您希望可以在'@ current_user'上調用方法嗎? – 2011-12-21 19:28:28

+0

@Dirk,歡迎來到stackoverflow!請記住「檢查」最能回答您問題的答案。對於任何問題,您也可以提出任何答案,並認爲您認爲有用/有幫助。 – 2011-12-22 01:04:41

回答

141

下面將列出用戶類有基類對象沒有方法...

>> 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是Classes和Class實例的一種方法。

下面是我的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_missingresponds_to技術來即時處理方法調用。因此,這些方法未在methods方法結果中列出。

+1

hmm? 「a」。方法工作正常。 – steenslag 2011-12-21 19:35:23

+2

雖然這可能不完整,因爲某些方法僅在調用method_missing時創建(例如動態查找程序) – 2011-12-21 19:36:07

+1

@steenslag - 正確。我不好。固定。 – 2011-12-21 19:43:52

3

其中之一呢?

object.methods.sort 
Class.methods.sort 
8

Module#instance_methods

返回包含在接收機公共和保護實例方法的名稱的數組。對於一個模塊,這些是公共和受保護的方法;對於一個類,它們是實例(而不是單例)方法。沒有參數或參數爲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 
4

你可以做

current_user.methods 

爲了更好的房源

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

假設用戶的has_many帖子:

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

,闡述在@ clyfe的answe河你可以使用下面的代碼的實例方法列表(假設你有一個名爲「分析器」對象類):

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

如果你正在尋找的,其通過實例迴應(在你的情況方法列表@當前用戶)。根據ruby文檔methods

返回obj的public和protected方法的名稱列表。 這將包括所有在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. 
相關問題