无法将数组分配给.ENV文件中的变量(rails app)

时间:2016-09-27 04:01:08

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

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

FOOD=["cookies", "grapes", "cake", "pie"]

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

User.create(name: "jane doe", favorite_foods: ENV["FOOD"])

这不起作用。当我为数据库设定种子时,不会创建此User实例。请帮忙。我已经看过关于" php"和"配置"文件,但没有明确详细说明如何实现这一目标。

当我将我的应用推送到Github或Heroku时,我把东西放在我的.env中,我不想让它变得可见。所以请记住,我不希望FOOD阵列对任何将部署/存储我的应用程序的公共空间可见。谢谢。

2 个答案:

答案 0 :(得分:4)

我建议使用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(',')
)

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

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

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

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

ENV.fetch('FOOD', 'default,food,list').split(',')
#=> ['default', 'food', 'list']

答案 1 :(得分:0)

您需要安装 dotenv gem才能加载.env环境变量。

https://github.com/bkeepers/dotenv