Estou procurando uma maneira de despejar a estrutura de um objeto, semelhante às funções do PHP print_r
e var_dump
por motivos de depuração.
Estou procurando uma maneira de despejar a estrutura de um objeto, semelhante às funções do PHP print_r
e var_dump
por motivos de depuração.
Respostas:
Em visualizações:
include DebugHelper
...your code...
debug(object)
Em controladores, modelos e outros códigos:
puts YAML::dump(object)
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!
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 .
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
.
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
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
Ultimamente estou usando o método awesome_print , ap
que 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 String
ou Numeric
(embora eu tenha que ajustar um pouco minha folha de estilo para obter uma aparência elegante)
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.
puts theobject.inspect.gsub(",", "\n")