Existe-t-il un équivalent print_r ou var_dump dans Ruby / Ruby on Rails?

111

Je cherche un moyen de vider la structure d'un objet, similaire aux fonctions PHP print_ret var_dumppour des raisons de débogage.

Daniel Rikowski
la source

Réponses:

133

La .inspectméthode de tout objet doit être formatée correctement pour l'affichage, faites simplement.

<%= theobject.inspect %>

La .methodsméthode peut également être utile:

<%= theobject.methods.inspect %>

Il peut être utile de mettre cela dans les <pre>balises, en fonction des données

dbr
la source
2
juste un gain de temps pour ceux qui recherchent un formatage plus soigné dans la console:puts theobject.inspect.gsub(",", "\n")
Gus
65

En vues:

include DebugHelper

...your code...

debug(object)

Dans les contrôleurs, modèles et autre code:

puts YAML::dump(object)

La source

Artem Russakovskii
la source
Le débogage (objet) de DebugHelper soulève la méthode non définie `DebugHelper's ':)
Arnold Roa
8

Dans une vue que vous pouvez utiliser, <%= debug(yourobject) %>elle générera une vue YAML de vos données. Si vous voulez quelque chose dans votre journal, vous devez utiliser logger.debug yourobject.inspect.

ujh
la source
6

Vous pouvez également utiliser le raccourci YAML :: dump ( y ) sous la console 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 vous souhaitez simplement prévisualiser le contenu d'une chaîne, essayez d'utiliser rise (par exemple dans les modèles, les contrôleurs ou tout autre endroit inaccessible). Vous obtenez le backtrace gratuitement :)

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

Je vous encourage également vraiment à essayer ruby-debug :

C'est incroyablement utile!

Marcin Urbanski
la source
6

Vous pouvez utiliser puts some_variable.inspect. Ou la version plus courte: p some_variable. Et pour une sortie plus jolie, vous pouvez utiliser la gemme awesome_print .

Trantor Liu
la source
3

Si vous voulez simplement que les données pertinentes soient affichées sur stdout (la sortie du terminal si vous exécutez à partir de la ligne de commande), vous pouvez utiliser p some_object.

Mikoangelo
la source
3

Les réponses précédentes sont excellentes mais si vous ne voulez pas utiliser la console (terminal), dans Rails, vous pouvez imprimer le résultat dans la vue en utilisant Helper ActionView :: Helpers :: DebugHelper du débogage

#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

résultats (dans le navigateur)

- !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
la source
0

J'utilise ça :)

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
la source
0

Dernièrement , je suis en utilisant awesome_print de apméthode qui fonctionne sur la console ainsi que dans les vues.

La sortie colorée spécifique au type fait vraiment une différence si vous avez besoin de rechercher visuellement des objets Stringou Numeric(même si j'ai dû modifier un peu ma feuille de style pour obtenir un aspect soigné)

Daniel Rikowski
la source
0

Récemment, je suis devenu un fan de PRY , je l'ai trouvé incroyablement pour faire des choses comme l'inspection des variables, le débogage du code en cours d'exécution et l'inspection du code externe. Cela pourrait être un peu exagéré en tant que réponse à cette question spécifique.

Daniël W. Crompton
la source