Esiste un equivalente print_r o var_dump in Ruby / Ruby on Rails?


111

Sto cercando un modo per scaricare la struttura di un oggetto, simile alle funzioni PHP print_re var_dumpper motivi di debug.

Risposte:


133

Il .inspectmetodo di qualsiasi oggetto dovrebbe formattare è corretto per la visualizzazione, basta farlo ..

<%= theobject.inspect %>

Il .methodsmetodo può anche essere utile:

<%= theobject.methods.inspect %>

Può essere utile inserirlo nei <pre>tag, a seconda dei dati


2
solo un risparmio di tempo per chi cerca una formattazione più ordinata in console:puts theobject.inspect.gsub(",", "\n")
Gus

65

Nelle visualizzazioni:

include DebugHelper

...your code...

debug(object)

In controller, modelli e altro codice:

puts YAML::dump(object)

fonte


DebugHelper's debug (object) raise undefined method `DebugHelper's ':)
Arnold Roa

8

In una vista puoi usare <%= debug(yourobject) %>che genererà una vista YAML dei tuoi dati. Se vuoi qualcosa nel tuo registro dovresti usare logger.debug yourobject.inspect.


6

Puoi anche usare la scorciatoia YAML :: dump ( y ) nella console di 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
>> 

Se vuoi solo visualizzare in anteprima alcuni contenuti di stringa, prova a usare raise (ad esempio nei modelli, nei controller o in qualche altro luogo inaccessibile). Ottieni il backtrace gratuitamente :)

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

Ti incoraggio davvero anche a provare ruby-debug :

È incredibilmente utile!



3

Se vuoi solo che i dati rilevanti vengano visualizzati su stdout (l'output del terminale se stai eseguendo dalla riga di comando), puoi usare p some_object.


3

Le risposte precedenti sono ottime ma se non vuoi usare la console (terminale), in Rails puoi stampare il risultato nella vista usando l'Helper ActionView :: Helpers :: DebugHelper del 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

risultati (nel 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

Io uso questo :)

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

Ultimamente sto usando il metodo di awesome_printap che funziona sia sulla console che nelle viste.

L'output colorato specifico del tipo fa davvero la differenza se è necessario scansionare visivamente Stringo Numericoggetti (anche se ho dovuto modificare un po 'il mio foglio di stile per ottenere un aspetto lucido)


0

Recentemente sono diventato un fan di PRY , l'ho trovato incredibilmente per fare cose come l'ispezione di variabili, il debug di codice in esecuzione e l'ispezione di codice esterno. Potrebbe essere un po 'eccessivo come risposta a questa domanda specifica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.