Ruby'de bir nesne için tüm yöntemler nasıl listelenir?


113

Belirli bir nesnenin erişebildiği tüm yöntemleri nasıl listeleyebilirim?

@current_userUygulama denetleyicisinde tanımlanan bir nesnem var :

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

Ve görünüm dosyasında kullanabileceğim yöntemleri görmek istiyorum. Özellikle, bir :has_manyderneğin hangi yöntemleri sağladığını görmek istiyorum . (Neyin :has_many sağlanması gerektiğini biliyorum ama bunu kontrol etmek istiyorum.)


Açıklığa kavuşturmak için, yöntemlerin çağrılabilir olmasını mı istiyorsunuz @current_user?
Andrew Marshall

@Dirk, stackoverflow'a hoş geldiniz! Sorunuzu en iyi yanıtlayan yanıtı "kontrol etmeyi" unutmayın. Ayrıca, yararlı / yararlı bulduğunuz herhangi bir soruya yanıt verin.
Larry K

Yanıtlar:


211

Aşağıda, User sınıfının temel Object sınıfının sahip olmadığı yöntemler listelenecektir ...

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

Bunun methodsSınıflar ve Sınıf örnekleri için bir yöntem olduğunu unutmayın .

Kullanıcı sınıfımın sahip olduğu ve ActiveRecord temel sınıfında olmayan yöntemler şunlardır:

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

User sınıfında tanımlanan (many) has_many ilişkisinin bir sonucu olarak oluşturulan yöntemlerin , çağrının sonuçlarında olmadığını unutmayınmethods .

Eklendi Not: has_many, yöntemleri doğrudan eklememektedir. Bunun yerine, ActiveRecord makinesi Ruby'yi method_missingve responds_toyöntem çağrılarını anında işlemek için teknikleri kullanır . Sonuç olarak, yöntemler, methodsyöntem sonucunda listelenmez .


2
Her ne kadar bazı yöntemler yalnızca method_missing çağrıldığında (örneğin dinamik bulucular) oluşturulduğundan bu tamamlanmayabilir
Frederick Cheung

yanıt verirsem? Bir yöntem eksik hatası alıyorum. Bunu application.html.erb içinde çalıştırıyorum
Dirk

@Dirk - belki yöntem mevcut değil ... AR Sınıfı tanımlarınızın ne olduğunu göstereceğiniz yeni bir soru sormanızı ve ardından has_many'nin sağlaması gerektiğini düşündüğünüz belirli yöntemleri sormanızı öneririm. Ayrıca şu eşleşme var mı: own_to? Rails'in AR için büyük harf kullanımı ve çoğulculuk kuralları birçok kişiyi yanlış yola götürdü ...
Larry K

@Larry. Teşekkürler - .to_yaml ile bir liste alabilirim. Şöyle görünür: --- -: eskizler -: sketch_ids -: sketches = -: sketch_ids = -: before_add_for_sketches -: before_add_for_sketches? <birçok ihmal edildi> ........ bu yöntemlere nasıl erişebilirim? (beni de takdir edilen belgelere işaret ediyor :)
Dirk

Docs eklenir yöntemlerin birçoğu Has_many gösterileri: için. Diğerleri, Rails'in sonraki sürümleri için yenidir. Bunlar "before_add_for" vb. İçerir. Bunlar "İlişkilendirme Geri Aramaları" dır - bu belgenin
Larry K

9

Modül # instance_methods

Alıcıdaki genel ve korumalı örnek yöntemlerinin adlarını içeren bir dizi döndürür. Bir modül için bunlar halka açık ve korumalı yöntemlerdir; bir sınıf için bunlar örnek (tekil değil) yöntemleridir. Bağımsız değişken olmadan veya yanlış bir bağımsız değişkenle moddaki örnek yöntemler döndürülür, aksi takdirde mod ve modun üst sınıflarındaki yöntemler döndürülür.

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

6

Ya da yalnızca User.methods(false)o sınıf içinde tanımlanan yöntemleri döndürmek için.


4

Yapabilirsin

current_user.methods

Daha iyi listeleme için

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


1

Kullanıcının has_many Gönderi olduğunu varsayalım:

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

1

@ Clyfe'nin cevabını açıklamak için. Aşağıdaki kodu kullanarak örnek yöntemlerinizin bir listesini alabilirsiniz ("Ayrıştırıcı" adlı bir Nesne Sınıfınız olduğunu varsayarak):

Parser.new.methods - Object.new.methods

1

Örneğe göre yanıt veren yöntemlerin listesine bakıyorsanız (sizin durumunuzda @ current_user). Ruby dokümantasyon yöntemlerine göre

Genel ve korumalı obj yöntemlerinin adlarının bir listesini döndürür. Bu, obj'in atalarında erişilebilen tüm yöntemleri içerecektir. İsteğe bağlı parametre yanlışsa, bir nesnenin genel ve korumalı tekil yöntemlerinin bir dizisini döndürür; dizi, nesnede bulunan modüllere yöntemleri dahil etmez.

@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.

Alternatif olarak, bir yöntemin bir nesnede çağrılabilir olup olmadığını da kontrol edebilirsiniz.

@current_user.respond_to?:your_method_name

Ana sınıf yöntemlerini istemiyorsanız, ondan üst sınıf yöntemlerini çıkarın.

@current_user.methods - @current_user.class.superclass.new.methods #methods that are available to @current_user instance.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.