Есть ли в Ruby / Ruby on Rails эквивалент print_r или var_dump?

111

Я ищу способ сбросить структуру объекта, аналогично функциям PHP print_rи var_dumpдля отладки.

Даниэль Риковски
источник

Ответы:

133

.inspectМетод любого объекта должен форматировать правильно для отображения, просто делать ..

<%= theobject.inspect %>

.methodsСпособ также может быть полезно:

<%= theobject.methods.inspect %>

Это может помочь поместить это в <pre>теги, в зависимости от данных

DBR
источник
2
просто экономия времени для тех, кто ищет более аккуратное форматирование в консоли:puts theobject.inspect.gsub(",", "\n")
Gus
65

В просмотрах:

include DebugHelper

...your code...

debug(object)

В контроллерах, моделях и другом коде:

puts YAML::dump(object)

Источник

Артем Русаковский
источник
DebugHelper's debug (object) вызывает неопределенный метод `DebugHelper's ':)
Арнольд Роа,
8

В представлении, которое вы можете использовать, <%= debug(yourobject) %>будет создано представление YAML для ваших данных. Если вы хотите что-то в своем журнале, вы должны использовать logger.debug yourobject.inspect.

ujh
источник
6

Вы также можете использовать сокращение YAML :: dump ( y ) в консоли 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
>> 

Если вы хотите просто предварительно просмотреть содержимое строки, попробуйте использовать поднять (например, в моделях, контроллерах или другом недоступном месте). Вы получаете трассировку бесплатно :)

>> raise Rails.root
RuntimeError: /home/marcin/work/github/project1
    from (irb):17
>> 

Я также очень рекомендую вам попробовать ruby-debug :

Это невероятно полезно!

Марцин Урбанский
источник
6

Вы можете использовать puts some_variable.inspect. Или сокращенный вариант: p some_variable. А для более красивого вывода вы можете использовать гем awesome_print .

Трантор Лю
источник
3

Если вы просто хотите, чтобы соответствующие данные отображались в stdout (вывод терминала, если вы работаете из командной строки), вы можете использовать p some_object.

Микоанджело
источник
3

Предыдущие ответы хороши, но если вы не хотите использовать консоль (терминал), в Rails вы можете распечатать результат в представлении, используя отладочную вспомогательную функцию 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
Папуш Гинслизиньо
источник
0

Пользуюсь этим :)

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
Павел Барчик
источник
0

В последнее время я использую метод awesome_print , apкоторый работает как на консоли, так и в представлениях.

Цветной вывод для конкретного типа действительно имеет значение, если вам нужно визуально сканировать объекты Stringили Numeric(хотя мне пришлось немного подправить свою таблицу стилей, чтобы получить безупречный вид)

Даниэль Риковски
источник
0

Недавно я стал поклонником PRY , я обнаружил, что он отлично подходит для таких вещей, как проверка переменных, отладка запущенного кода и проверка внешнего кода. Ответ на этот конкретный вопрос может показаться излишним.

Даниэль В. Кромптон
источник