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.

Daniel Rikowski
sumber

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

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

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

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

Marcin Urbanski
sumber
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 .

Trantor Liu
sumber
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.

Mikoangelo
sumber
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
Papouche Guinslyzinho
sumber
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
Pawel Barcik
sumber
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)

Daniel Rikowski
sumber
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.

Daniël W. Crompton
sumber