Gibt es in Ruby / Ruby on Rails ein print_r- oder var_dump-Äquivalent?

111

Ich suche nach einer Möglichkeit, die Struktur eines Objekts ähnlich wie bei den PHP-Funktionen print_rund var_dumpaus Debugging-Gründen zu sichern.

Daniel Rikowski
quelle

Antworten:

133

Die .inspectMethode eines Objekts, das formatiert werden soll, ist für die Anzeige korrekt.

<%= theobject.inspect %>

Die .methodsMethode kann auch von Nutzen sein:

<%= theobject.methods.inspect %>

<pre>Abhängig von den Daten kann es hilfreich sein, dies in Tags einzufügen

dbr
quelle
2
Nur eine Zeitersparnis für diejenigen, die nach einer saubereren Formatierung in der Konsole suchen:puts theobject.inspect.gsub(",", "\n")
Gus
65

In Ansichten:

include DebugHelper

...your code...

debug(object)

In Steuerungen, Modellen und anderem Code:

puts YAML::dump(object)

Quelle

Artem Russakovskii
quelle
DebugHelper's Debug (Objekt) löst eine undefinierte Methode `DebugHelper's 'aus :)
Arnold Roa
8

In einer Ansicht, die Sie verwenden können <%= debug(yourobject) %>, wird eine YAML-Ansicht Ihrer Daten generiert. Wenn Sie etwas in Ihrem Protokoll haben möchten, sollten Sie verwenden logger.debug yourobject.inspect.

ujh
quelle
6

Sie können auch YAML :: dump shorthand ( y ) unter der Rails-Konsole verwenden:

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

Wenn Sie wollen einfach nur ein paar String Inhalt der Vorschau anzeigen , versuchen Sie es mit raise (zum Beispiel bei den Modellen, Controller oder einem anderen unzugänglichen Ort). Sie erhalten die Rückverfolgung kostenlos :)

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

Ich ermutige Sie auch wirklich, Ruby-Debug zu versuchen :

Es ist unglaublich hilfreich!

Marcin Urbanski
quelle
6

Sie können verwenden puts some_variable.inspect. Oder die kürzere Version : p some_variable. Und für eine schönere Ausgabe können Sie das Juwel awesome_print verwenden .

Trantor Liu
quelle
3

Wenn Sie nur möchten, dass die relevanten Daten in stdout angezeigt werden (die Terminalausgabe, wenn Sie über die Befehlszeile ausgeführt werden), können Sie verwenden p some_object.

Mikoangelo
quelle
3

Frühere Antworten sind großartig, aber wenn Sie die Konsole (das Terminal) nicht verwenden möchten, können Sie in Rails das Ergebnis in der Ansicht mit dem Helper ActionView :: Helpers :: DebugHelper des Debugs drucken

#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

Ergebnisse (im 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
quelle
0

Ich benutze das :)

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

In letzter Zeit verwende ich die Methode von awesome_print , apdie sowohl auf der Konsole als auch in Ansichten funktioniert.

Die typspezifische farbige Ausgabe macht wirklich einen Unterschied , ob man für visuell scannen müssen Stringoder NumericGegenstände (Obwohl ich hatte mein Sheet ein wenig , um zwicken ein poliertes Aussehen zu erhalten)

Daniel Rikowski
quelle
0

Vor kurzem bin ich ein Fan von PRY geworden . Ich fand es unglaublich, Dinge wie das Überprüfen von Variablen, das Debuggen von laufendem Code und das Überprüfen von externem Code zu tun. Als Antwort auf diese spezielle Frage könnte es ein wenig übertrieben sein.

Daniël W. Crompton
quelle