Я думаю, что я пытаюсь получить эквивалент PHP print_r()
(печатать для человека); в настоящее время необработанный выход:Как распечатать содержимое объекта в Rails для легкой отладки?
ActiveRecord::Relation:0x10355d1c0
Что мне делать?
Я думаю, что я пытаюсь получить эквивалент PHP print_r()
(печатать для человека); в настоящее время необработанный выход:Как распечатать содержимое объекта в Rails для легкой отладки?
ActiveRecord::Relation:0x10355d1c0
Что мне делать?
Обычно я попробую .inspect
, если это не дает мне то, что я хочу, я переключусь на .to_yaml
.
class User
attr_accessor :name, :age
end
user = User.new
user.name = "John Smith"
user.age = 30
puts user.inspect
#=> #<User:0x423270c @name="John Smith", @age=30>
puts user.to_yaml
#=> --- !ruby/object:User
#=> age: 30
#=> name: John Smith
Надеюсь, что это поможет.
Я знаю, что это necro'ing, но это был один из первых хитов в google для поиска объектов, и это помогло мне преодолеть проблему, над которой я работаю уже 3 дня! Так что спасибо и вот +1 для тебя. – Ryan
Я обнаружил, что некоторые выходы YAML записей содержат больше данных (метаданные, возможно?), Чем мне хочется. Если я ищу версию YAML записи, я буду использовать 'y record_name.attributes'. '# y' является псевдонимом для' to_yaml'. – Tass
определить метод to_s в вашей модели. Например,
class Person < ActiveRecord::Base
def to_s
"Name:#{self.name} Age:#{self.age} Weight: #{self.weight}"
end
end
Затем, когда вы переходите к печати с #puts, он отображает эту строку с этими переменными.
Что делать, если вы не знаете, какие переменные содержатся в нем? – cjm2671
Можете ли вы уточнить? Вы говорите, что, если переменная является массивом или хэшем? Их #to_s позаботятся об этом. –
Это неверно сформулировано. 'puts my_model_instance' не будет вызывать' to_s'. Вам придется явно это сделать: 'puts my_model_instance.to_s' – thisismydesign
Вам необходимо использовать debug(@var)
. Это точно так же, как «print_r».
Это не вещь, по крайней мере, на Ruby 1.9.x - NoMethodError: undefined method 'debug 'for main: Object –
Я не сторонник установки драгоценного камня для чего-то такого простого, но я регулярно использую Awesome Print. – Tass
Это действительно хорошо, что я в конце концов сделал в своем коде: Rails.logger.ap someObject –
gem install awesome_print (никаких изменений, необходимых для Gemfile) – Jay
В Rails можно распечатать результат в представлении с помощью отладки»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
Результаты (в браузере)
- !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
Это лучший способ. –
inspect
Отлично, но иногда недостаточно. Например. BigDecimal
печатает как это: #<BigDecimal:7ff49f5478b0,'0.1E2',9(18)>
.
Чтобы получить полный контроль над тем, что напечатано, вы можете переопределить to_s
или inspect
методов. Или создайте свой собственный, чтобы не путать будущих отладчиков слишком много.
class Something < ApplicationRecord
def to_s
attributes.map{ |k, v| { k => v.to_s } }.inject(:merge)
end
end
Это будет применяться метод (т.е. to_s
) по всем признакам. Этот пример избавится от уродливого BigDecimals
.
Вы также можете переопределить горсть только атрибуты:
def to_s
attributes.merge({ my_attribute: my_attribute.to_s })
end
Вы также можете создать смесь из двух или somehow добавить ассоциации.
Если вы не видели его (поскольку вы приняли ответ, опубликованный непосредственно перед моим), обратите внимание, что функция debug() работает точно так же, как print_r() в PHP. – Andrew
Только для тех, кто придет на эту страницу позже, отладка() устарела, она больше не включена как функция. Не получится. (Подтвердите это http://stackoverflow.com/users/231309/irongaze-com, указав это дальше по странице.) – 0112