¿Existe un equivalente print_r o var_dump en Ruby / Ruby on Rails?

111

Estoy buscando una forma de volcar la estructura de un objeto, similar a las funciones de PHP print_ry var_dumppor motivos de depuración.

Daniel Rikowski
fuente

Respuestas:

133

El .inspectmétodo de cualquier objeto debe formatearse correctamente para su visualización, simplemente hágalo ..

<%= theobject.inspect %>

El .methodsmétodo también puede ser útil:

<%= theobject.methods.inspect %>

Puede ser útil poner eso en <pre>etiquetas, según los datos

dbr
fuente
2
solo un ahorro de tiempo para aquellos que buscan un formato más ordenado en la consola:puts theobject.inspect.gsub(",", "\n")
Gus
65

En vistas:

include DebugHelper

...your code...

debug(object)

En controladores, modelos y otro código:

puts YAML::dump(object)

Fuente

Artem Russakovskii
fuente
DebugHelper's debug (object) raise método indefinido 'DebugHelper's' :)
Arnold Roa
8

En una vista que puede utilizar <%= debug(yourobject) %>, generará una vista YAML de sus datos. Si desea algo en su registro, debe usar logger.debug yourobject.inspect.

ujh
fuente
6

También puede usar YAML :: dump shorthand ( y ) en la consola de 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
>> 

Si solo desea obtener una vista previa del contenido de algunas cadenas, intente usar raise (por ejemplo, en modelos, controladores o algún otro lugar inaccesible). Obtienes el backtrace gratis :)

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

También te animo a que pruebes ruby-debug :

¡Es increíblemente útil!

Marcin Urbanski
fuente
6

Puede utilizar puts some_variable.inspect. O la versión más corta: p some_variable. Y para una salida más bonita, puede usar la gema awesome_print .

Trantor Liu
fuente
3

Si solo desea que los datos relevantes se muestren en stdout (la salida del terminal si está ejecutando desde la línea de comando), puede usar p some_object.

Mikoangelo
fuente
3

Las respuestas anteriores son geniales, pero si no desea usar la consola (terminal), en Rails puede imprimir el resultado en la Vista utilizando el Asistente de depuración 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

resultados (en el 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
fuente
0

Yo uso esto :)

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

Últimamente estoy usando el método de awesome_printap que funciona tanto en la consola como en las vistas.

La salida de color específica del tipo realmente marca la diferencia si necesita escanear visualmente Stringu Numericobjetos (aunque tuve que modificar un poco mi hoja de estilo para obtener un aspecto pulido)

Daniel Rikowski
fuente
0

Recientemente me he convertido en un fanático de PRY , lo he encontrado increíblemente para hacer cosas como inspeccionar variables, depurar código en ejecución e inspeccionar código externo. Podría ser un poco exagerado responder a esta pregunta específica.

Daniël W. Crompton
fuente