Sto cercando un modo per scaricare la struttura di un oggetto, simile alle funzioni PHP print_r
e var_dump
per motivi di debug.
Sto cercando un modo per scaricare la struttura di un oggetto, simile alle funzioni PHP print_r
e var_dump
per motivi di debug.
Risposte:
Nelle visualizzazioni:
include DebugHelper
...your code...
debug(object)
In controller, modelli e altro codice:
puts YAML::dump(object)
Puoi anche usare la scorciatoia YAML :: dump ( y ) nella console di 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 vuoi solo visualizzare in anteprima alcuni contenuti di stringa, prova a usare raise (ad esempio nei modelli, nei controller o in qualche altro luogo inaccessibile). Ottieni il backtrace gratuitamente :)
>> raise Rails.root
RuntimeError: /home/marcin/work/github/project1
from (irb):17
>>
Ti incoraggio davvero anche a provare ruby-debug :
È incredibilmente utile!
Puoi usare puts some_variable.inspect
. O la versione più breve: p some_variable
. E per risultati più belli , puoi usare la gemma awesome_print .
Se vuoi solo che i dati rilevanti vengano visualizzati su stdout (l'output del terminale se stai eseguendo dalla riga di comando), puoi usare p some_object
.
Le risposte precedenti sono ottime ma se non vuoi usare la console (terminale), in Rails puoi stampare il risultato nella vista usando l'Helper ActionView :: Helpers :: DebugHelper del 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
risultati (nel browser)
- !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
Io uso questo :)
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 sto usando il metodo di awesome_printap
che funziona sia sulla console che nelle viste.
L'output colorato specifico del tipo fa davvero la differenza se è necessario scansionare visivamente String
o Numeric
oggetti (anche se ho dovuto modificare un po 'il mio foglio di stile per ottenere un aspetto lucido)
Recentemente sono diventato un fan di PRY , l'ho trovato incredibilmente per fare cose come l'ispezione di variabili, il debug di codice in esecuzione e l'ispezione di codice esterno. Potrebbe essere un po 'eccessivo come risposta a questa domanda specifica.
puts theobject.inspect.gsub(",", "\n")