มี print_r หรือ var_dump ที่เทียบเท่าใน Ruby / Ruby on Rails หรือไม่


111

ฉันกำลังมองหาวิธีถ่ายโอนโครงสร้างของวัตถุคล้ายกับฟังก์ชัน PHP print_rและvar_dumpเพื่อเหตุผลในการดีบัก

คำตอบ:


133

.inspectวิธีการของวัตถุใด ๆ ควรจัดรูปแบบถูกต้องสำหรับการแสดงผลเพียงแค่ทำ ..

<%= theobject.inspect %>

.methodsวิธีก็อาจจะเป็นการใช้งาน:

<%= theobject.methods.inspect %>

อาจช่วยได้ในการใส่<pre>แท็กขึ้นอยู่กับข้อมูล


2
ประหยัดเวลาสำหรับผู้ที่มองหาการจัดรูปแบบที่ดีกว่าในคอนโซล:puts theobject.inspect.gsub(",", "\n")
Gus

65

ในมุมมอง:

include DebugHelper

...your code...

debug(object)

ในตัวควบคุมรุ่นและรหัสอื่น ๆ :

puts YAML::dump(object)

ที่มา


DebugHelper ของ debug (วัตถุ) เพิ่มวิธีการที่ไม่ได้กำหนด `` DebugHelper's ':)
Arnold Roa

8

ในมุมมองคุณสามารถใช้<%= debug(yourobject) %>ซึ่งจะสร้างมุมมอง YAML ของข้อมูลของคุณ logger.debug yourobject.inspectถ้าคุณต้องการบางสิ่งบางอย่างในบันทึกของคุณคุณควรใช้


6

คุณยังสามารถใช้YAML :: dump shorthand ( y ) ภายใต้ Rails console:

>> y User.first
--- !ruby/object:User 
attributes: 
  created_at: 2009-05-24 20:16:11.099441
  updated_at: 2009-05-26 22:46:29.501245
  current_login_ip: 127.0.0.1
  id: "1"
  current_login_at: 2009-05-24 20:20:46.627254
  login_count: "1"
  last_login_ip: 
  last_login_at: 
  login: admin
attributes_cache: {}

=> nil
>> 

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

>> raise Rails.root
RuntimeError: /home/marcin/work/github/project1
    from (irb):17
>> 

ฉันขอแนะนำให้คุณลองใช้Ruby-debug :

เป็นประโยชน์อย่างเหลือเชื่อ!


6

คุณสามารถใช้puts some_variable.inspect. หรือรุ่นที่สั้นกว่า: p some_variable. และสำหรับการส่งออกสวย, คุณสามารถใช้อัญมณี awesome_print


3

หากคุณต้องการให้ข้อมูลที่เกี่ยวข้องแสดงเป็น stdout (เอาต์พุตเทอร์มินัลหากคุณกำลังเรียกใช้จากบรรทัดคำสั่ง) คุณสามารถใช้p some_object.


3

คำตอบก่อนหน้านี้ดีมาก แต่ถ้าคุณไม่ต้องการใช้คอนโซล (เทอร์มินัล) ใน Rails คุณสามารถพิมพ์ผลลัพธ์ใน View ได้โดยใช้ตัวช่วยActionView :: Helpers :: DebugHelper ของ debug

#app/view/controllers/post_controller.rb
def index
 @posts = Post.all
end

#app/view/posts/index.html.erb
<%= debug(@posts) %>

#start your server
rails -s

ผลลัพธ์ (ในเบราว์เซอร์)

- !ruby/object:Post
  raw_attributes:
    id: 2
    title: My Second Post
    body: Welcome!  This is another example post
    published_at: '2015-10-19 23:00:43.469520'
    created_at: '2015-10-20 00:00:43.470739'
    updated_at: '2015-10-20 00:00:43.470739'
  attributes: !ruby/object:ActiveRecord::AttributeSet
    attributes: !ruby/object:ActiveRecord::LazyAttributeHash
      types: &5
        id: &2 !ruby/object:ActiveRecord::Type::Integer
          precision: 
          scale: 
          limit: 
          range: !ruby/range
            begin: -2147483648
            end: 2147483648
            excl: true
        title: &3 !ruby/object:ActiveRecord::Type::String
          precision: 
          scale: 
          limit: 
        body: &4 !ruby/object:ActiveRecord::Type::Text
          precision: 
          scale: 
          limit: 
        published_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter
          subtype: &1 !ruby/object:ActiveRecord::Type::DateTime
            precision: 
            scale: 
            limit: 
        created_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter
          subtype: *1
        updated_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter
          subtype: *1

0

ฉันใช้สิ่งนี้ :)

require 'yaml'

module AppHelpers
  module Debug
    module VarDump

      class << self

        def dump(dump_object, file_path)
          File.open file_path, "a+" do |log_file|
            current_date = Time.new.to_s + "\n" + YAML::dump(dump_object) + "\n"
            log_file.puts current_date
            log_file.close
          end
        end

      end

    end
  end
end

0

เมื่อเร็ว ๆ นี้ผมใช้awesome_print 's apวิธีการที่ทำงานบนคอนโซลเช่นเดียวกับในมุมมอง

เอาต์พุตสีเฉพาะประเภทสร้างความแตกต่างได้จริงๆหากคุณต้องการสแกนหาStringหรือ Numericวัตถุด้วยสายตา(แม้ว่าฉันจะต้องปรับแต่งสไตล์ชีตของฉันเล็กน้อยเพื่อให้ได้รูปลักษณ์ที่สวยงาม)


0

เมื่อเร็ว ๆ นี้ฉันได้เป็นแฟนของPRYฉันพบว่ามันเหลือเชื่อมากสำหรับการทำสิ่งต่างๆเช่นการตรวจสอบตัวแปรการดีบักโค้ดที่รันและการตรวจสอบโค้ดภายนอก คำตอบสำหรับคำถามเฉพาะนี้อาจเกินความจำเป็นเล็กน้อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.