วิธีแสดงรายการวิธีการทั้งหมดสำหรับวัตถุใน Ruby


113

ฉันจะแสดงรายการวิธีการทั้งหมดที่ออบเจ็กต์หนึ่งเข้าถึงได้อย่างไร

ฉันมี@current_userวัตถุที่กำหนดไว้ในตัวควบคุมแอปพลิเคชัน:

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

และต้องการดูว่ามีวิธีใดบ้างที่ฉันสามารถใช้ได้ในไฟล์มุมมอง โดยเฉพาะอย่างยิ่งฉันต้องการดูว่าการ:has_manyเชื่อมโยงมีวิธีใดบ้าง (ฉันรู้ว่า:has_many ควรให้อะไรบ้างแต่ต้องการตรวจสอบ)


เพื่อความชัดเจนคุณต้องการวิธีการที่เรียกว่า@current_user?
Andrew Marshall

@ เดิร์กยินดีต้อนรับสู่ stackoverflow! อย่าลืม "ตรวจสอบ" คำตอบที่ตอบคำถามของคุณได้ดีที่สุด เพิ่มคะแนนคำตอบสำหรับคำถามใด ๆ ที่คุณคิดว่ามีประโยชน์ / เป็นประโยชน์
Larry K

คำตอบ:


211

ต่อไปนี้จะแสดงวิธีการที่คลาส 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.

โปรดสังเกตว่าเมธอดที่สร้างขึ้นจากความสัมพันธ์ (many) has_many ที่กำหนดไว้ในคลาส User ไม่ได้อยู่ในผลลัพธ์ของการmethodsเรียก

เพิ่มหมายเหตุว่า has_many ไม่ได้เพิ่มเมธอดโดยตรง แต่เครื่องจักร ActiveRecord จะใช้ Ruby method_missingและresponds_toเทคนิคในการจัดการกับวิธีการโทรได้ทันที ด้วยเหตุนี้เมธอดจึงไม่อยู่ในรายการmethodsผลลัพธ์ของวิธีการ


2
แม้ว่าวิธีนี้อาจไม่สมบูรณ์เนื่องจากเมธอดบางอย่างถูกสร้างขึ้นเมื่อมีการเรียก method_missing เท่านั้น (เช่นตัวค้นหาแบบไดนามิก)
Frederick Cheung

ถ้าฉันลอง response_to? ฉันได้รับข้อผิดพลาดวิธีการ ฉันกำลังเรียกใช้สิ่งนี้ภายใน application.html.erb
Dirk

@ เดิร์ก - อาจไม่มีวิธีการนี้ ... ฉันขอแนะนำให้คุณตั้งคำถามใหม่โดยที่คุณแสดงว่านิยามคลาส AR ของคุณคืออะไรแล้วถามเกี่ยวกับวิธีการเฉพาะที่คุณคิดว่า has_many ควรมีให้ คุณมีรายการที่ตรงกันหรือไม่? กฎการใช้อักษรตัวพิมพ์ใหญ่และพหูพจน์ของ Rails สำหรับ AR ทำให้หลายคนหลงทาง ...
Larry K

@ แลร์รี่. ขอบคุณ - ฉันขอรายชื่อด้วย. to_yaml ได้ ดูเหมือนว่า: --- -: sketches -: sketch_ids -: sketches = -: sketch_ids = -: before_add_for_sketches -: before_add_for_sketches? <หลายที่ละไว้> ........ ฉันจะเข้าถึงวิธีการเหล่านั้นได้อย่างไร? (ชี้ให้ฉันดูเอกสารด้วย :)
Dirk

เอกสารสำหรับ: แสดง has_many หลายวิธีการที่จะมีการเพิ่ม อื่น ๆ เป็นของใหม่สำหรับ Rails รุ่นใหม่กว่า ซึ่งรวมถึง "before_add_for" เป็นต้นซึ่งเป็น "Association Callbacks" - ดูส่วนนั้นของเอกสาร
Larry K

9

โมดูล # instance_methods

ส่งคืนอาร์เรย์ที่มีชื่อของวิธีการอินสแตนซ์สาธารณะและที่ได้รับการป้องกันในเครื่องรับ สำหรับโมดูลเหล่านี้เป็นวิธีสาธารณะและได้รับการป้องกัน สำหรับคลาสเป็นวิธีการอินสแตนซ์ (ไม่ใช่ซิงเกิลตัน) โดยไม่มีอาร์กิวเมนต์หรืออาร์กิวเมนต์ที่เป็นเท็จเมธอดอินสแตนซ์ใน mod จะถูกส่งกลับมิฉะนั้นวิธีการในคลาส superclass ของ 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

เพื่ออธิบายคำตอบของ @ clyfe คุณสามารถรับรายการวิธีการอินสแตนซ์ของคุณโดยใช้รหัสต่อไปนี้ (สมมติว่าคุณมี Object Class ชื่อ "Parser"):

Parser.new.methods - Object.new.methods

1

หากคุณกำลังดูรายการวิธีการที่ตอบสนองโดยอินสแตนซ์ (ในกรณีของคุณ @current_user) ตามวิธีการจัดทำเอกสารทับทิม

ส่งคืนรายชื่อของวิธีการสาธารณะและที่ได้รับการป้องกันของ obj ซึ่งจะรวมถึงวิธีการทั้งหมดที่สามารถเข้าถึงได้ในบรรพบุรุษของ obj หากพารามิเตอร์ที่เป็นทางเลือกเป็นเท็จจะส่งคืนอาร์เรย์ของเมธอด public และ singleton ที่ได้รับการป้องกันของ 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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.