为Rails设置环境变量(ENV)的使用

15

在Rails服务器上尝试使用MongoID,并对如何/在哪里设置环境变量感到困惑。

config/mongoid.yml默认模板提供:

defaults: &defaults
  host: localhost

...

# set these environment variables on your prod server
production:
  host: <%= ENV['MONGOID_HOST'] %>
  port: <%= ENV['MONGOID_PORT'] %>
  username: <%= ENV['MONGOID_USERNAME'] %>
  password: <%= ENV['MONGOID_PASSWORD'] %>
  database: <%= ENV['MONGOID_DATABASE'] %>

我的问题是这些设置在Rails中吗?还是在系统级别上?如果是的话,如何设置才能使它们在没有用户账户登录的情况下有效?


您不一定需要使用这些MONGOID_环境变量--您可以直接在yaml文件中设置值。 - Dylan Markow
2
是的,但我正在尝试学习最佳实践。我也不想将密码嵌入代码中,因此也不会在git中出现。 - Meltemi
2个回答

16

ENV哈希将包含Rails进程启动时系统环境中的值。

这些可以在启动服务器或程序之前通过命令行设置。例如,在Bash中:

export MONGOID_USERNAME='username'

如果你不将它们添加到配置文件中,那么它们只在当前的终端会话中生效。但是即使将它们添加到配置文件中,也可能因为你的网络服务器没有使用该配置文件而无法生效,因此仅适用于本地开发。

你也可以在 Apache 中通过 SetEnv 来设置这些变量,例如:

<Location /app >
    SetEnv MONGOID_HOST 'localhost'
    SetEnv MONGOID_PORT '8883'
    SetEnv MONGOID_USERNAME 'username'
</Location>
这可以出现在你的Apache配置文件中任何合法的SetEnv位置,并且与你的应用程序所处的上下文相同。
关于最佳实践,有些人会在源代码控制中放置一个示例yml配置文件,并忽略源代码控制中的config/*.yml文件。 克隆存储库时,将示例复制并更正为正确的值是设置的一部分,就像运行rake tmp:create来创建tmp文件夹结构一样。

1
Apache、Nginx 还是独立服务器? - danivovich
我们正在使用带有Passenger的Apache。 - Meltemi
我们首先处理 default.yml,然后在 Cap 配方中将实际的 database.yml 复制到我们的 SQL 数据库中,但我看到 MongoID 的默认值中使用了环境变量,所以想进行调查。感谢 Apache SetEnv 信息! - Meltemi

0
我想在这里添加另一个选项。 在启动时,Rails将尝试将DATABASE_URL作为URL读取,并从该环境变量连接到数据库(忽略database.yml)。 您应指定数据库如下:
DATABASE_URL="mysql2://user:pass@localhost/app_development" rails server

你可以通过以下方式进行验证:

DATABASE_URL="..." rails runner "p ActiveRecord::Base.connection_config"

这只是另一种选择,而不是将 erb 设置放入 database.yml 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接