在生产中使用dotenv或将env变量传递给js / js.erb?并尝试使用凭据

时间:2019-03-27 07:28:06

标签: javascript ruby-on-rails ruby stripe-payments connect

我试图将我的可发布数据条的ENV变量传递给Connect的stripe.js文件。

Dotenv宝石:

gem 'dotenv-rails', groups: [:development, :test, :production]

我将其添加到了dotenv gem .env文件中:

STRIPE_PUBLISHABLE_KEY=pk_test_xxxxxxxxxx
STRIPE_SECRET_KEY=sk_test_xxxxxxxxxx

然后将其添加到我的stripe.js.erb文件中:

var stripe = Stripe("<%= ENV['STRIPE_PUBLISHABLE_KEY']%>");

将stripe.js更改为stripe.js.erb可以在本地工作,但是ENV在生产中似乎不起作用。在Heroku变量中,设置了它。而且,如果我将密钥直接传递到stripe.js / .js / erb中,它将起作用,因此,在生产过程中,ENV不能正常工作。

即使我将代码放入带有标签的视图中,也无法使用,除非我直接将密钥传递进来。

herokus方面我没有收到任何错误。

我也尝试使用凭据:

stripe:
  stripe_publishable_key: pk_test_x
  stripe_secret_key: sk_test_x

在我的stripe.js / .js.erb文件中:

  var stripe = Stripe('<%= Rails.application.credentials.dig(:stripe, :stripe_publishable_key) %>');

(我使用此确切格式进行活动存储并正常工作 并尝试:

 var stripe = Stripe('<%= Rails.application.credentials.stripe[:stripe_publishable_key] %>');

有了这些,我将以下错误推送到heroku:

  

NoMethodError:nil:NilClass的未定义方法“ []”

问题:如何将ENV变量传递到生产环境?

使用.erb解决了该问题,但现在的问题是ENV文件未投入生产。

2 个答案:

答案 0 :(得分:0)

如果您记得要预编译资产(在处理heroku时经常会忘记这一点),则需要将js.erb文件显式添加到预编译列表中(SO postmore detailed blog post

在这种情况下,实际上您实际上不需要将其包装在变量中。可以(应该)包含可发布的密钥以标识您的Stripe帐户,并且插值方式无论如何都将以纯文本形式发送(您通常希望通过使用ENV变量来避免这种情况),因此您可以完全跳过插值步骤。

根据评论进行编辑: 您需要验证是否在Heroku上实际设置了环境密钥。有两种检查方法:

  • 登录CLI并检查
  • 还要检查信息中心中的设置(this包含有关如何同时执行这两个操作的示例)

如果您在已编译的JS中得到一个空字符串,那么这至少表明该ERB正在得到处理,因此错误很可能在插入时没有任何内插值。

只需重申一下,就没有理由隐藏可发布的密钥(这就是为什么称其为“密钥”,以及文档为何将其明确传递的原因)。此外,将其放入插入文本的ENV中也不会隐藏任何内容。

答案 1 :(得分:0)

我认为您在使用凭证方法时忘记了在Heroku应用程序中设置RAILS_MASTER_KEY环境变量。从您的代码库中分配master.key的内容。