ruby-on-rails 在生产环境中使用dotenv,还是将env变量传递给js/js.erb?并尝试使用凭据

pobjuy32  于 2023-05-13  发布在  Ruby
关注(0)|答案(2)|浏览(139)

我正在尝试将条带可发布密钥的ENV变量传递到用于Connect的stripe.js文件。

Dotenv gem:

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:undefined方法`[]' for nil:NilClass

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

使用.erb解决了这个问题,但现在的问题是ENV文件无法到达生产环境。

kx7yvsdv

kx7yvsdv1#

如果您记得预编译资产(在处理heroku时我经常忘记这一点),则需要显式地将js.erb文件添加到预编译列表中(SO postmore detailed blog post)。
但是在这种情况下,实际上不需要将其 Package 在变量中。可以(应该)包括可发布的密钥以识别您的Stripe帐户,并且插值无论如何都会以纯文本形式发送它(您通常希望通过使用ENV变量来避免),因此您可以完全跳过interp步骤。

**从评论中编辑:**您需要验证在Heroku上实际设置了env密钥。有两种检查方法:

  • 登录到CLI并检查
  • 检查 Jmeter 板中的设置(this有关于如何执行这两项操作的示例)

如果你在编译后的JS中得到一个空字符串,那么这至少表明ERB正在被处理,所以错误很可能是没有什么可以插值的。
重申一下,没有理由隐藏可发布的密钥(这就是为什么它被称为可发布密钥,以及为什么文档以明文传递它)。此外,将其放在插入文本的ENV中并没有隐藏任何东西。

4ktjp1zp

4ktjp1zp2#

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

相关问题