Помощник консоли Rails 'y' возвращает NameError, а не вывод форматирования yaml

Я пытаюсь использовать y object в консоли Rails 3.2.6/Ruby 1.9.3, чтобы получить красиво отформатированный вывод yaml для объекта ActiveRecord, но по какой-то причине он у меня не работает. Я использовал его в прошлом, но где-то по пути он сломался. Я получаю следующий вывод, когда пытаюсь:

NameError: undefined local variable or method `yaml' for main:Object

person swrobel    schedule 20.07.2012    source источник


Ответы (2)


Метод y на самом деле является расширением объекта Kernel, созданным Синхронный парсер/эмиттер YAML. Вот последние несколько строк lib/ruby/1.9.1/syck.rb:

module Kernel
    def y( object, *objects )
        objects.unshift object
        puts( if objects.length == 1
                  YAML.dump( *objects )
              else
                  YAML.dump_stream( *objects )
              end )
    end
    private :y
end

По умолчанию Ruby 1.9.3 использует Psych parser/emitter вместо Syck (я могу только предположить, что они произносятся по-разному) , и Psych не объявляет такой метод.

Если вы действительно любили y, вы можете просто использовать Syck вместо Psych в консоли:

Loading development environment (Rails 3.2.5)
1.9.3p194 :001 > y 'hello'
NoMethodError: undefined method 'y' for main:Object
1.9.3p194 :002 > YAML::ENGINE.yamler = 'syck'
"syck"
1.9.3p194 :003 > y 'hello'
--- hello
nil

Я также воспользуюсь этим шансом, чтобы подключить awesome_print, который делает практически все, что y делает для YAML.

person Brandan    schedule 20.07.2012
comment
Люблю awesome_print! Спасибо за рек! - person swrobel; 01.08.2012
comment
если вы поместите эту строку (YAML::ENGINE.yamler = 'syck') в свой ~/.irbc, тогда метод 'y' всегда будет вам доступен, когда вы загрузите консоль irb или rails - person concept47; 19.07.2013

Для rails 4/ruby 2 вы можете использовать только

puts object.to_yaml
person eKek0    schedule 04.12.2013
comment
Это то, что я делал. Но потом я наткнулся на то, что, как я думал, будет сокращением, использующим объект y. видимо ошибся :( - person user12121234; 16.10.2015