Я сталкиваюсь с ошибкой в to_yaml, но вижу, что она исправлена в более поздних версиях ruby (или rails?). Мне интересно, как лучше обойти это.
Возьмите символический ключ, содержащий неуклюжий символ (любой символ Юникода, или я только что заметил, что символ #
также делает это). to_yaml
делает некоторое неправильное экранирование таким образом, что становится очевидным, когда я делаю обратное YAML.load
для него:
2.3.8 :001 > hash = {:"my key with an awkward # char"=>"my value"}
=> {:"my key with an awkward # char"=>"my value"}
2.3.8 :002 > hash.to_yaml
=> "--- \n\":\\\"my key with an awkward # char\\\"\": my value\n"
2.3.8 :003 > YAML.load(hash.to_yaml)
=> {":\"my key with an awkward # char\""=>"my value"}
Это в нашем проекте Rails 3.2 на ruby 2.3.8. Я также вижу проблему на рельсах 4.0.13. Но с более поздним проектом Rails 5.2.4 ruby 2.6.3:
2.6.3 :007 > hash = {:"my key with an awkward # char"=>"my value"}
=> {:"my key with an awkward # char"=>"my value"}
2.6.3 :008 > hash.to_yaml
=> "---\n! ':my key with an awkward # char': my value\n"
2.6.3 :009 > YAML.load(hash.to_yaml)
=> {:"my key with an awkward # char"=>"my value"}
Он возвращается к исходному ха sh.
Моя проблема в том, что ActiveRecord Сериализация делает это в нашей базе данных, но я заметил, что основа c to_yaml
показывает проблему.
Полагаю, мне просто нужно знать, какие символы вызывают проблему, и как я могу это сделать. обнаружить их, чтобы запретить их?