2011-01-28 2 views
70

Я думаю, что я пытаюсь получить эквивалент PHP print_r() (печатать для человека); в настоящее время необработанный выход:Как распечатать содержимое объекта в Rails для легкой отладки?

ActiveRecord::Relation:0x10355d1c0 

Что мне делать?

+0

Если вы не видели его (поскольку вы приняли ответ, опубликованный непосредственно перед моим), обратите внимание, что функция debug() работает точно так же, как print_r() в PHP. – Andrew

+0

Только для тех, кто придет на эту страницу позже, отладка() устарела, она больше не включена как функция. Не получится. (Подтвердите это http://stackoverflow.com/users/231309/irongaze-com, указав это дальше по странице.) – 0112

ответ

161

Обычно я попробую .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 

Надеюсь, что это поможет.

+8

Я знаю, что это necro'ing, но это был один из первых хитов в google для поиска объектов, и это помогло мне преодолеть проблему, над которой я работаю уже 3 дня! Так что спасибо и вот +1 для тебя. – Ryan

+1

Я обнаружил, что некоторые выходы YAML записей содержат больше данных (метаданные, возможно?), Чем мне хочется. Если я ищу версию YAML записи, я буду использовать 'y record_name.attributes'. '# y' является псевдонимом для' to_yaml'. – Tass

8

определить метод to_s в вашей модели. Например,

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

Затем, когда вы переходите к печати с #puts, он отображает эту строку с этими переменными.

+0

Что делать, если вы не знаете, какие переменные содержатся в нем? – cjm2671

+0

Можете ли вы уточнить? Вы говорите, что, если переменная является массивом или хэшем? Их #to_s позаботятся об этом. –

+0

Это неверно сформулировано. 'puts my_model_instance' не будет вызывать' to_s'. Вам придется явно это сделать: 'puts my_model_instance.to_s' – thisismydesign

-2

Вам необходимо использовать debug(@var). Это точно так же, как «print_r».

+5

Это не вещь, по крайней мере, на Ruby 1.9.x - NoMethodError: undefined method 'debug 'for main: Object –

3

Я использую awesome_print gem

Таким образом, вы просто должны ввести:

ap @var 
+2

Я не сторонник установки драгоценного камня для чего-то такого простого, но я регулярно использую Awesome Print. – Tass

+0

Это действительно хорошо, что я в конце концов сделал в своем коде: Rails.logger.ap someObject –

+0

gem install awesome_print (никаких изменений, необходимых для Gemfile) – Jay

4

В 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 
+1

Это лучший способ. –

0

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 добавить ассоциации.

Смежные вопросы