1

我想创建数组并在.ENV文件分配给一个变量,像这样:无法分配在.ENV文件数组变量(Rails应用程序)

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

而且然后,在一个单独的文件seed.rb,创建对象的实例,如在下面的例子中,并使用“FOOD”阵列来定义我的对象的属性:

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

这不起作用。当我种子数据库时,这个用户实例不会被创建。请帮助。我见过有关“php”和“config”文件的内容,但没有详细说明如何实现这一点。

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

回答

3

我会建议使用工头或Dotenv从.ENV文件加载环境变量。按照Rails安装说明https://github.com/bkeepers/dotenv

这里有一个问题:据我所知,你不能直接存储一个数组作为环境变量。你可以做什么 - 而这正是我在大多数应用程序中所做的 - 使用逗号分隔的字符串,并在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'] 
+0

这个工作!谢谢马特!我已经在使用“dotenv”宝石,但我在那里有一个数组。这种使它成为逗号分隔字符串的方法,然后将它分割成我的seed.rb文件中的数组! –

+0

太棒了!您介意将我的答案标记为已接受吗? – Matt