Existe um print_r ou var_dump equivalente em Ruby / Ruby on Rails?

111

Estou procurando uma maneira de despejar a estrutura de um objeto, semelhante às funções do PHP print_re var_dumppor motivos de depuração.

Daniel Rikowski
fonte

Respostas:

133

O .inspectmétodo de qualquer objeto deve ser formatado corretamente para exibição, basta fazer ..

<%= theobject.inspect %>

O .methodsmétodo também pode ser útil:

<%= theobject.methods.inspect %>

Pode ajudar colocar isso em <pre>tags, dependendo dos dados

dbr
fonte
2
apenas uma economia de tempo para aqueles que procuram uma formatação mais limpa no console:puts theobject.inspect.gsub(",", "\n")
Gus
65

Em visualizações:

include DebugHelper

...your code...

debug(object)

Em controladores, modelos e outros códigos:

puts YAML::dump(object)

Fonte

Artem Russakovskii
fonte
DebugHelper's debug (objeto) levanta método indefinido `DebugHelper's ':)
Arnold Roa
8

Em uma visualização, você pode usar o <%= debug(yourobject) %>que irá gerar uma visualização YAML de seus dados. Se você quiser algo em seu log, você deve usar logger.debug yourobject.inspect.

ujh
fonte
6

Você também pode usar YAML :: dump shorthand ( y ) no console do 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 você quiser apenas visualizar alguns conteúdos da string, tente usar raise (por exemplo, em modelos, controladores ou algum outro lugar inacessível). Você obtém o backtrace de graça :)

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

Eu também realmente encorajo você a experimentar ruby-debug :

É incrivelmente útil!

Marcin Urbanski
fonte
6

Você pode usar puts some_variable.inspect. Ou a versão mais curta: p some_variable. E para uma saída mais bonita, você pode usar a gem awesome_print .

Trantor Liu
fonte
3

Se você deseja apenas que os dados relevantes sejam exibidos para stdout (a saída do terminal se você estiver executando a partir da linha de comando), você pode usar p some_object.

Mikoangelo
fonte
3

Respostas anteriores são ótimas, mas se você não quiser usar o console (terminal), no Rails você pode imprimir o resultado na View usando o Helper ActionView :: Helpers :: DebugHelper do 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

resultados (no navegador)

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

Eu uso isso :)

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

Ultimamente estou usando o método awesome_print , apque funciona no console e também nas visualizações.

A saída colorida específica do tipo realmente faz a diferença se você precisa procurar visualmente por objetos Stringou Numeric(embora eu tenha que ajustar um pouco minha folha de estilo para obter uma aparência elegante)

Daniel Rikowski
fonte
0

Recentemente, tornei-me um fã do PRY , e achei incrível para fazer coisas como inspecionar variáveis, depurar código em execução e inspecionar código externo. Pode ser um pouco exagero como resposta a esta pergunta específica.

Daniël W. Crompton
fonte