无法将数组分配给 .ENV 文件中的变量(rails 应用程序)

Dia*_* E. 2 ruby arrays environment ruby-on-rails environment-variables

我想创建一个数组并将其分配给 .env 文件中的一个变量,如下所示:

FOOD=["cookies", "grapes", "cake", "pie"]
Run Code Online (Sandbox Code Playgroud)

然后,在一个单独的 seed.rb 文件中,创建一个对象的实例,如下例所示,并使用“FOOD”数组来定义我的对象的属性:

User.create(name: "jane doe", favorite_foods: ENV["FOOD"])
Run Code Online (Sandbox Code Playgroud)

这不起作用。当我为数据库做种时,不会创建这个 User 实例。请帮忙。我看过有关“php”和“config”文件的内容,但没有明确详细说明如何逐步实现这一点。

当我将应用程序推送到 Github 或 Heroku 时,我在 .env 中放入了不希望显示的内容。所以请记住,我不希望 FOOD 数组对将部署/存储我的应用程序的任何公共空间可见。谢谢。

小智 6

我建议使用 Foreman 或 Dotenv 从 .env 文件加载环境变量。按照https://github.com/bkeepers/dotenv 上的 Rails 安装说明进行操作。

这是一个问题:据我所知,您不能直接将数组存储为环境变量。你可以做的是——这就是我在我的大多数应用程序中所做的——是使用逗号分隔的字符串,并在 Ruby 中处理它。

例如:

# .env
FOOD=cookies,grapes,cake,pie

# seeds.rb
User.create!(
  name: "Jane Doe",
  favorite_foods: ENV.fetch('FOOD').split(',')
)
Run Code Online (Sandbox Code Playgroud)

这会将逗号分隔的字符串拆分为一个数组,并在赋值中使用它。

使用该.create!方法(与!)可能会帮助您调试未创建实例的原因,因为它会立即返回验证错误等。

此外,#fetch在此处使用将确保存在环境变量,否则将引发错误。

如果您希望应用程序在缺少该环境变量的情况下回退到默认列表,您还可以使用:

ENV.fetch('FOOD', 'default,food,list').split(',')
#=> ['default', 'food', 'list']
Run Code Online (Sandbox Code Playgroud)