Comment imprimer le contenu d’un object dans Rails pour un débogage facile?

Je pense que j’essaie d’obtenir l’équivalent PHP de print_r() (print lisible par l’homme); à l’heure actuelle, la sortie brute est:

 ActiveRecord::Relation:0x10355d1c0 

Que devrais-je faire?

En général, j’essaie d’abord .inspect , si cela ne me donne pas ce que je veux, je passerai à .to_yaml .

 class User attr_accessor :name, :age end user = User.new user.name = "John Smith" user.age = 30 puts user.inspect #=> # puts user.to_yaml #=> --- !ruby/object:User #=> age: 30 #=> name: John Smith 

J’espère que cela pourra aider.

définir la méthode to_s dans votre modèle. Par exemple

 class Person < ActiveRecord::Base def to_s "Name:#{self.name} Age:#{self.age} Weight: #{self.weight}" end end 

Ensuite, quand vous allez l'imprimer avec #puts, il affiche cette chaîne avec ces variables.

Dans Rails, vous pouvez imprimer le résultat dans la vue en utilisant le paramètre debug ‘Helper 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_atsortingbutes: 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' atsortingbutes: !ruby/object:ActiveRecord::AtsortingbuteSet atsortingbutes: !ruby/object:ActiveRecord::LazyAtsortingbuteHash 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::Ssortingng precision: scale: limit: body: &4 !ruby/object:ActiveRecord::Type::Text precision: scale: limit: published_at: !ruby/object:ActiveRecord::AtsortingbuteMethods::TimeZoneConversion::TimeZoneConverter subtype: &1 !ruby/object:ActiveRecord::Type::DateTime precision: scale: limit: created_at: !ruby/object:ActiveRecord::AtsortingbuteMethods::TimeZoneConversion::TimeZoneConverter subtype: *1 updated_at: !ruby/object:ActiveRecord::AtsortingbuteMethods::TimeZoneConversion::TimeZoneConverter subtype: *1 

J’utilise le bijou awesome_print

Il suffit donc de taper:

 ap @var 

inspect est super mais parfois pas assez bien. Par exemple, BigDecimal imprime comme ceci: # .

Pour contrôler entièrement ce qui est imprimé, vous pouvez redéfinir to_s ou inspect méthodes. Ou créez le vôtre pour ne pas trop confondre les futurs développeurs.

  class Something < ApplicationRecord def to_s attributes.map{ |k, v| { k => v.to_s } }.inject(:merge) end end 

Cela appliquera une méthode (ie to_s ) à tous les atsortingbuts. Cet exemple va se débarrasser des vilains BigDecimals .

Vous pouvez également redéfinir une poignée d’atsortingbuts uniquement:

  def to_s atsortingbutes.merge({ my_atsortingbute: my_atsortingbute.to_s }) end 

Vous pouvez également créer un mélange des deux ou append des associations.

.inspect est ce que vous cherchez, il est beaucoup plus facile que l’ .to_yaml !

 user = User.new user.name = "will" user.email = "will@example.com" user.inspect # 

Vous devez utiliser debug(@var) . C’est exactement comme “print_r”.