【问题标题】:Ruby on Rails: Can you put Ruby code in a YAML config file?Ruby on Rails:你能把 Ruby 代码放在 YAML 配置文件中吗?
【发布时间】:2011-03-17 16:28:11
【问题描述】:

我想在我的 amazon_s3.yml 配置文件中做这样的事情:

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

...但我知道这行不通。不确定这是否可能,但您可以将 Ruby 代码放在 YAML 文件中吗?

【问题讨论】:

    标签: ruby yaml


    【解决方案1】:

    如果它是通过 ERB 解释的,则可以,在这种情况下,它就像一个 ERB 视图,Ruby 代码在 <%%> 之间移动

    试试:

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

    ...看看它是否有效

    【讨论】:

    • 抱歉,这对我不起作用。看来我得做点别的了
    • 在 Rails yml 配置文件中为我工作
    • 嗨,如果我需要将 2 个 env 组合在一起怎么办?就我而言,mongoid.yml 需要以 hostname:port 格式指定主机,我尝试了不同的组合无济于事 或放入 2分开 :
    【解决方案2】:

    通常/不直接。我这样说是因为为了使用 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 定义为环境变量它会开箱即用。

    【讨论】:

      【解决方案3】:

      使用 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'] %>
      

      【讨论】:

      • access_key_id: &lt;%= ENV['S3_KEY']} %&gt; 中的大括号错字
      【解决方案4】:

      无需任何额外代码(Rails 4.2)对我来说就像一个魅力:

      default: &default
        adapter: <%= 'mysql2' %>
      

      【讨论】:

        【解决方案5】:

        在 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"
        

        您还可以在 YAML 文件中的字符串中编写 ruby​​ 代码,然后稍后对其进行评估

        # yaml file
        retry_interval: '5.minues'
        
        # then you can do
        eval(ENV.fetch('retry_interval'))
         => 300 seconds
        

        注意:使用 eval 时要非常小心,因为它可能会带来严重的安全风险

        【讨论】:

          猜你喜欢
          • 2012-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多