web-dev-qa-db-ja.com

Ruby on Rails:YAML構成ファイルにRubyコードを記述できますか?

Amazon_s3.yml設定ファイルで次のようなことをしたいと思います:

access_key_id: ENV['S3_KEY']
secret_access_key: ENV['S3_SECRET']

...しかし、これが機能していないことはわかっています。可能かどうかはわかりませんが、RubyコードをYAMLファイルに挿入できますか?

39
Andrew

通常/直接ではありません。 Rubyの結果を使用するには、ファイルをロードする前にERBのようなものを使用する必要があるためです。コードに関しては、次のようなものから移動する必要があります。

loaded_data = YAML.load_file("my-file.yml")

あるいは

loaded_data = YAML.load(File.read("my-file.yml"))

に:

loaded_data = YAML.load(ERB.new(File.read("my-file.yml")).result)

この特定のケースでは、ファイルをロードしているものを確認する必要があります。場合によっては、環境から直接ロードするようにすでに設計されているか、次のいずれかを行う必要があります。

  1. モンキーパッチ
  2. Fork +カスタムバージョンを使用します。

Amazon_s3.ymlを使用するプラグインがいくつかあるので、それを使用するどのライブラリを使用しているかを投稿する価値があるかもしれません-あるいは、簡単なgoogleから、AWSライブラリではAmazon_ACCESS_KEY_IDとAmazon_SECRET_ACCESS_KEYを環境変数として定義すると、それが箱から取り出します。

66
Sutto

ERBを通じて解釈される場合は、ERBビューのように機能し、Rubyコードは<%および%>

試してください:

access_key_id: <%= ENV['S3_KEY'] %>
secret_access_key: <%= ENV['S3_SECRET'] %>

...それが機能するかどうかを確認します

13

Fdの例を使用して、アプリケーションがHAMLを使用するように構成されている場合は、ERB構文を文字列補間でスワップアウトしてみてください。例えば。、:

access_key_id: #{ENV['S3_KEY']}
secret_access_key: #{ENV['S3_SECRET']}

の代わりに:

access_key_id: <%= ENV['S3_KEY']} %>
secret_access_key: <%= ENV['S3_SECRET'] %>
2
Noz

追加のコードなしで私にとって魅力のように機能します(Rails 4.2):

default: &default
  adapter: <%= 'mysql2' %>
1
Artur Beljajev

Rails 4.2では、ERB構文を使用してコードを評価し、文字列を返します。

# environment variables
S3_KEY=01234
S3_SECRET=56789

# yaml file
access_key_id: <%= ENV['S3_KEY'] %>
secret_access_key: <%= ENV['S3_SECRET'] %>

# then you can do
ENV.fetch('access_key_id')
 => "01234"
ENV.fetch('secret_access_key')
 => "56789"

RubyコードをYAMLファイルの文字列に記述し、後で評価することもできます

# yaml file
retry_interval: '5.minues'

# then you can do
eval(ENV.fetch('retry_interval'))
 => 300 seconds

注意:evalを使用する場合は、深刻なセキュリティリスクが発生する可能性があるため、十分に注意してください

1
HarlemSquirrel