让我们假设我有一个config/secrets.yml
文件,它包含:
development:
app_name: MyApp
secret: <%= ENV['SECRET_VALUE'] %>
如果我用换行符设置SECRET_VALUE
,它将中断。例句:
export SECRET_VALUE=$(printf "hellonworld")
然后,当我启动我的铁路应用程序,我得到这个错误:
/usr/local/lib/ruby/3.0.0/psych.rb:457:in 'parse': (<unknown>): could not find expected ':' while scanning a simple key at line 4 column 1 (Psych::SyntaxError)
ENV['SECRET_VALUE']
的文字值在解析之前被添加到yaml文件中。。这意味着如果我想实现我想要做的事情,我必须做这样的事情:
export SECRET_VALUE=$(printf "|n hellon world")
这是有效的,但这是非常丑陋的,我不可能是唯一一个认为这种行为是荒谬的??有更好的方法吗?编辑:
我尝试在值周围添加引号:
development:
app_name: MyApp
secret: "<%= ENV['SECRET_VALUE'] %>"
"works"但是换行符被从字符串中删除…
root@4e4431bae32e:/app# rails console
Loading development environment (Rails 7.0.3)
irb(main):001:0> puts ENV['SECRET_VALUE']
hello
world
=> nil
irb(main):002:0> puts Rails.application.secrets[:secret]
hello world
=> nil
在我的用例中保留换行符是很重要的。
可以使用转义的引号字符串。对于String#dump
, YAML的字符串格式与Ruby的超集非常相似:
development:
app_name: MyApp
secret: <%= ENV['SECRET_VALUE'].dump %>