我的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']
}
答案 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