Existe-t-il un équivalent Print R ou var dump dans Ruby / Ruby on Rails?

Je cherche un moyen de vider la structure d'un objet, similaire aux fonctions PHP print_r et var_dump pour des raisons de débogage.

97
demandé sur Daniel Rikowski 2009-05-24 21:59:22

10 réponses

La méthode .inspect de tout objet doit être mise en forme correctement pour l'affichage, il suffit de le faire..

<%= theobject.inspect %>

La méthode .methods peut également être utile:

<%= theobject.methods.inspect %>

Cela peut aider à mettre cela dans les balises <pre>, en fonction des données

121
répondu dbr 2009-05-24 18:06:31

Dans les vues:

include DebugHelper

...your code...

debug(object)

Dans les contrôleurs, modèles et autres codes:

puts YAML::dump(object)

Source

63
répondu Artem Russakovskii 2016-05-13 17:23:21

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

8
répondu ujh 2009-05-25 13:57:57

Vous pouvez également utiliser YAML:: dump raccourci ( y ) sous Rails console:

>> 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 voulez simplement prévisualiser le contenu de la chaîne, essayez d'utiliser raise (par exemple dans les modèles, les contrôleurs ou un autre endroit inaccessible). Vous obtenez le backtrace gratuitement:)

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

Je vous encourage aussi à essayer Ruby-debug :

C'est incroyablement utile!

6
répondu Marcin Urbanski 2009-05-26 23:04:35

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 .

5
répondu Trantor Liu 2014-12-22 06:59:11

Si vous voulez juste 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.

3
répondu Mikoangelo 2009-05-25 12:50:45

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 L'aide du débogage 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

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
2
répondu Papouche Guinslyzinho 2015-10-20 05:11:18

J'utilise ceci :)

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
0
répondu Pawel Barcik 2012-03-04 05:51:57

Dernièrement, j'utilise la méthodeawesome_print ap 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 String ou Numeric (Bien que j'ai dû modifier un peu ma feuille de style pour obtenir un aspect poli)

0
répondu Daniel Rikowski 2012-06-17 08:32:10

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

0
répondu Daniël W. Crompton 2014-11-28 01:34:54