Apakah ada print_r atau var_dump yang setara di Ruby / Ruby on Rails?


111

Saya sedang mencari cara untuk membuang struktur suatu objek, mirip dengan fungsi PHP print_rdan var_dumpuntuk alasan debugging.

Jawaban:


133

The .inspectMetode dari setiap objek harus memformat adalah benar untuk tampilan, lakukan ..

<%= theobject.inspect %>

The .methodsMetode juga mungkin digunakan:

<%= theobject.methods.inspect %>

Mungkin membantu untuk meletakkannya di <pre>tag, tergantung pada datanya


2
hanya penghemat waktu bagi mereka yang mencari format yang lebih rapi di konsol:puts theobject.inspect.gsub(",", "\n")
Gus

65

Dalam tampilan:

include DebugHelper

...your code...

debug(object)

Di pengontrol, model, dan kode lainnya:

puts YAML::dump(object)

Sumber


DebugHelper's debug (objek) memunculkan metode yang tidak ditentukan `DebugHelper's ':)
Arnold Roa

8

Dalam sebuah tampilan, Anda dapat menggunakan <%= debug(yourobject) %>yang akan menghasilkan tampilan YAML dari data Anda. Jika Anda menginginkan sesuatu di log Anda, Anda harus menggunakan logger.debug yourobject.inspect.


6

Anda juga dapat menggunakan YAML :: dump shorthand ( y ) di bawah konsol Rails:

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

Jika Anda ingin melihat pratinjau beberapa konten string, coba gunakan kenaikan (misalnya di model, pengontrol, atau tempat lain yang tidak dapat diakses). Anda mendapatkan backtrace gratis :)

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

Saya juga sangat mendorong Anda untuk mencoba ruby-debug :

Ini sangat membantu!


6

Anda bisa menggunakan puts some_variable.inspect. Atau versi yang lebih pendek: p some_variable. Dan untuk hasil yang lebih cantik, Anda dapat menggunakan permata awesome_print .


3

Jika Anda hanya ingin data yang relevan ditampilkan ke stdout (keluaran terminal jika Anda menjalankan dari baris perintah), Anda dapat menggunakan p some_object.


3

Jawaban sebelumnya sangat bagus, tetapi jika Anda tidak ingin menggunakan konsol (terminal), di Rails Anda dapat mencetak hasilnya di View dengan menggunakan Helper 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

hasil (di browser)

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

Saya menggunakan ini :)

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

Akhir-akhir ini saya menggunakan awesome_print 's apmetode yang bekerja pada konsol serta dalam pandangan.

Keluaran berwarna khusus jenis benar-benar membuat perbedaan jika Anda perlu memindai objek Stringatau secara visual Numeric(Meskipun saya harus mengubah sedikit stylesheet saya untuk mendapatkan tampilan yang dipoles)


0

Baru-baru ini saya menjadi penggemar PRY , saya merasa luar biasa karena melakukan hal-hal seperti memeriksa variabel, men-debug kode yang sedang berjalan, dan memeriksa kode eksternal. Ini mungkin sedikit berlebihan sebagai jawaban untuk pertanyaan khusus ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.