rails 3:有没有办法在environment.rb而不是foo.yml中放置gem的配置参数?

时间:2011-06-03 06:37:56

标签: ruby-on-rails environment-variables yaml

我的rails应用程序使用一个gem,需要在foo.yml中指定一些配置参数:

development:
  username: MyDevUserName
  password: MyDevPassword
production:
  username: MyPRODUserName
  password: MyPRODPassword

我不想在我的源代码中使用密码,并希望执行以下操作:

development:
  username: <%= ENV['THE_USERNAME'] %>
  password: <%= ENV['THE_PASSWORD'] %>
production:
  username: <%= ENV['THE_USERNAME'] %>
  password: <%= ENV['THE_PASSWORD'] %>

但是,出于某种原因,&lt;%= ENV ['XXX']%&gt;在我的Settings.yml文件中工作,但在我的foo.yml文件中不起作用(我猜不过foo gem加载了.yml文件它不允许解释)。

因此...

我想知道Ruby / Rails是否有通用的方法在environment.rb而不是foo.yml文件中指定变量?

我可以举例说明一个空的foo.yml文件并将以下内容添加到 environment.rb

Foo::_something_._somethingelse =
{
  :username => ENV['THE_USERNAME'],
  :password => ENV['THE_PASSWORD']
}

1 个答案:

答案 0 :(得分:3)

编辑:因为你在Heroku上......

Heroku是一个不同的故事。您对ENV的使用可能与Heroku内置的一些功能相冲突,这些功能用于处理配置变量,例如您正在使用的配置变量。你需要(鼓励,请)...... CONFIG VARS 。有关如何在Heroku部署中设置配置变量,如何从应用程序访问配置变量以及如何使其全部在本地工作的信息,请参阅this page in the Heroku Dev Center

编辑:以下是原始答案,仍适用于一般(非heroku)案例

即使你把它放在environment.rb中,它仍然会在你的源代码中。

执行此操作的正确方法是忽略版本控制中的foo.yml文件(例如,在git中,您将文件添加到.gitignore文件中)。这样,您可以在本地拥有所需的文件,但它永远不会被提交到您的存储库,因此您的信誉不会泄露。在部署服务器上,您还必须手动创建该文件,因为从源代码部署时,部署将不会拥有该文件。

如果您使用capistrano进行部署,常见的方法是将文件放在[app] /shared/config/foo.yml中,然后将部署任务添加到从[sharedpath]到[releasepath]的软链接。 capistrano中的这样一项任务可能如下所示:

task :after_update_code do
  run "ln -s #{shared_path}/config/foo.yml #{release_path}/config/foo.yml"
end