为什么YAML.safe_load在YAML别名上失败?

时间:2017-03-24 13:19:58

标签: ruby-on-rails ruby yaml react-on-rails

我的Rails应用程序中的一个语言环境文件可以正常使用Rails,但当我尝试将它与react_on_rails rake任务(rake react_on_rails:locale)一起使用时,我收到此错误:

Psych::BadAlias: Unknown alias: item_attributes

我发现rake任务基本上是调用YAML.safe_load,所以我准备了没有Rails的最简单的例子,错误仍然存​​在。这是示例Ruby脚本:

require 'yaml'

YAML.safe_load(File.open('test.yml'))

这是test.yml文件(实际语言环境文件的较短版本):

pl:
  language: Polski
  dictionary_name: simple
  activerecord:
    attributes:
      line_item: &item_attributes
        variant: Produkt
        quantity: Ilosc
        price: Cena Netto
        total_price: Wartosc Netto
        vat_rate: VAT
        total_vat_amount: Kwota VAT
        total_gross_price: Wartosc Brutto
      order_item:
        <<: *item_attributes

我仍然收到错误:

/usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0/psych/visitors/to_ruby.rb:402:in `visit_Psych_Nodes_Alias': Unknown alias: item_attributes (Psych::BadAlias)

任何想法为什么这对Rails工作正常但在这里失败?是否有其他方法可以避免YAML文件中的重复并使其适用于Rails和YAML.safe_load

1 个答案:

答案 0 :(得分:11)

我在精神文件中找到了答案https://ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych.html

  

通过更改aliases参数可以明确允许别名。例如:

x = []
x << x
yaml = Psych.dump x
Psych.safe_load yaml               # => raises an exception
Psych.safe_load yaml, [], [], true # => loads the aliases

是否允许别名是一个布尔值,作为第四个参数传递给safe_load