Czy istnieje odpowiednik print_r lub var_dump w Ruby / Ruby on Rails?

111

Szukam sposobu na zrzucenie struktury obiektu, podobnej do funkcji PHP print_ri var_dumpdo debugowania.

Daniel Rikowski
źródło

Odpowiedzi:

133

.inspectMetoda dowolnego obiektu powinny format jest poprawnie na wyświetlaczu, po prostu zrobić ..

<%= theobject.inspect %>

.methodsSposób ten może być także stosowane:

<%= theobject.methods.inspect %>

W <pre>zależności od danych może pomóc umieszczenie tego w tagach

dbr
źródło
2
to tylko oszczędność czasu dla tych, którzy szukają schludniejszego formatowania na konsoli:puts theobject.inspect.gsub(",", "\n")
Gus,
65

W widokach:

include DebugHelper

...your code...

debug(object)

W kontrolerach, modelach i innym kodzie:

puts YAML::dump(object)

Źródło

Artem Russakovskii
źródło
DebugHelper's debug (object) podnosi niezdefiniowaną metodę `DebugHelper's ':)
Arnold Roa
8

W widoku możesz użyć, <%= debug(yourobject) %>który wygeneruje widok YAML twoich danych. Jeśli chcesz coś znaleźć w swoim logu, powinieneś użyć logger.debug yourobject.inspect.

ujh
źródło
6

Możesz także użyć YAML :: dump shorthand ( y ) w konsoli 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
>> 

Jeśli chcesz po prostu przejrzeć zawartość łańcucha, spróbuj użyć podniesienia (na przykład w modelach, kontrolerach lub innym niedostępnym miejscu). Otrzymujesz ślad za darmo :)

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

Gorąco zachęcam do wypróbowania ruby-debug :

To niezwykle pomocne!

Marcin Urbański
źródło
6

Możesz użyć puts some_variable.inspect. Lub krótsza wersja: p some_variable. A dla ładniejszego wydruku możesz użyć klejnotu awesome_print .

Trantor Liu
źródło
3

Jeśli chcesz tylko, aby odpowiednie dane były wyświetlane na stdout (dane wyjściowe terminala, jeśli korzystasz z wiersza poleceń), możesz użyć p some_object.

Mikoangelo
źródło
3

Wcześniejsze odpowiedzi są świetne, ale jeśli nie chcesz używać konsoli (terminala), w Railsach możesz wydrukować wynik w widoku za pomocą pomocnika Debug ActionView :: Helpers :: DebugHelper

#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

wyniki (w przeglądarce)

- !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
źródło
0

Używam tego :)

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
Paweł Barcik
źródło
0

Ostatnio używam metody awesome_print , apktóra działa zarówno na konsoli, jak iw widokach.

Kolorowe dane wyjściowe specyficzne dla typu naprawdę robią różnicę, jeśli musisz wizualnie przeskanować Stringlub Numericobiektów (chociaż musiałem trochę poprawić mój arkusz stylów, aby uzyskać dopracowany wygląd)

Daniel Rikowski
źródło
0

Ostatnio stałem się fanem PRY , odkryłem , że jest niesamowity do robienia takich rzeczy, jak sprawdzanie zmiennych, debugowanie uruchomionego kodu i inspekcja kodu zewnętrznego. Odpowiedź na to pytanie może być przesadą.

Daniël W. Crompton
źródło