我试图将我的可发布数据条的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文件未投入生产。
答案 0 :(得分:0)
如果您记得要预编译资产(在处理heroku时经常会忘记这一点),则需要将js.erb文件显式添加到预编译列表中(SO post,more detailed blog post)
在这种情况下,实际上您实际上不需要将其包装在变量中。可以(应该)包含可发布的密钥以标识您的Stripe帐户,并且插值方式无论如何都将以纯文本形式发送(您通常希望通过使用ENV变量来避免这种情况),因此您可以完全跳过插值步骤。>
根据评论进行编辑: 您需要验证是否在Heroku上实际设置了环境密钥。有两种检查方法:
如果您在已编译的JS中得到一个空字符串,那么这至少表明该ERB正在得到处理,因此错误很可能在插入时没有任何内插值。
只需重申一下,就没有理由隐藏可发布的密钥(这就是为什么称其为“密钥”,以及文档为何将其明确传递的原因)。此外,将其放入插入文本的ENV中也不会隐藏任何内容。
答案 1 :(得分:0)
我认为您在使用凭证方法时忘记了在Heroku应用程序中设置RAILS_MASTER_KEY
环境变量。从您的代码库中分配master.key
的内容。