【发布时间】:2014-03-17 09:10:24
【问题描述】:
我有一个 Rails 应用程序,它设置为使用 Capistrano 部署到两个不同服务器之一(取决于用户选择部署到哪个服务器)。我想为 Rails 应用程序创建一个环境变量,该变量会根据网站部署到的服务器而变化。
在我的 Capistrano 部署 (config/deploy.rb) 文件中,我有一个变量“stages”,它有两个选项供用户部署到:
set :stages, %w(production staging)
我尝试在我的环境 (config/environment.rb) 文件中的 if 语句中使用此变量来设置变量,如下所示:
if (:stages == "staging")
ENV['GLOBAL_EMAIL'] = "email1@domain.com"
else
ENV['GLOBAL_EMAIL'] = "email2@domain.com"
end
但是,当我对此进行测试时,rails 无法呈现 #{ENV['GLOBAL_EMAIL']}(据我所知,因为该变量未设置或无法访问。
我的问题是:stages 无法访问是否有原因,以及是否有根据环境设置变量的方法/更好的方法?
请注意,即使一种称为 staging 一种称为生产,两种环境都部署了 rails 的生产环境(不是 rails 的测试和生产环境),因此我无法进行测试以查看 rails 运行到哪个环境设置变量。
【问题讨论】:
-
在红宝石中
:stages是一个符号。你试过stages吗?此外,新版本的 capistrano 通常具有 deploy/stage1.rb 和 deploy/stage2.rb 结构,因此您不必在您所在的舞台上执行这种 if/else 操作。你运行的是什么版本的 Cap? -
我使用的是 2.13.5 版本,我确实有两个不同的部署,每个环境一个,将变量放在那里确实更有意义。请原谅我对此的无知,但我现在正试图在我的每个部署文件(对于每个环境)中放置'set :email_var,“email@domain.com”',但是当我测试它并尝试访问 email_var 时,我收到“未定义的局部变量或方法”错误。我以为,默认情况下,部署文件中设置的变量在范围内是全局的?
标签: ruby-on-rails ruby-on-rails-3 environment-variables capistrano