为什么 YAML.safe_load 在 YAML 别名上失败?
Why is YAML.safe_load failing on a YAML alias?
我的 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
的任何其他方法?
我在 https://ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych.html 的 Psych 文档中找到了答案。
Aliases can be explicitly allowed by changing the aliases parameter. For example:
x = []
x << x
yaml = Psych.dump x
Psych.safe_load yaml # => raises an exception
Psych.safe_load yaml, [], [], true # => loads the aliases
是否允许别名是一个布尔值作为第四个参数传递给safe_load
。
我的 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
的任何其他方法?
我在 https://ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych.html 的 Psych 文档中找到了答案。
Aliases can be explicitly allowed by changing the aliases parameter. For example:
x = []
x << x
yaml = Psych.dump x
Psych.safe_load yaml # => raises an exception
Psych.safe_load yaml, [], [], true # => loads the aliases
是否允许别名是一个布尔值作为第四个参数传递给safe_load
。