所以我试图让我的代码与 Stripe 的 js 示例相匹配:
var stripe = Stripe('pk_test_REST_OF_MY_KEY');
以下是我的 .js.erb
文件中的几行,它们从 Secrets.yml 文件中调用正确的 key 。渲染时,我在浏览器控制台中收到以下错误 Uncaught ReferenceError: pk_test_REST_OF_MY_KEY is not Defined
var stripe = Stripe(
<% if Rails.env == 'production' %>
<%= Rails.application.secrets.stripe(['publishable_key']).second[1].to_s %>
<% else %>
<%= Rails.application.secrets.stripe(['publishable_key']).first[1].to_s %>
<% end %>
);
我已经尝试过
... Stripe(`
RUBY LINES BETWEEN BACKTICKS
`);
... Stripe(' +
RUBY LINES BETWEEN PLUSES
+ ');
所以它必须是一些挑剔的 js 语法,其中 (' ');
不接受 ruby 值作为字符串,对吧?我们知道 ruby 正在运行,因为控制台错误正在打印正确的值。
此外,Ruby 是正确的,因为它生成 Rails.application.secrets.stripe(['publishable_key']).first[1].to_s
=> 在控制台中的“pk_test_REST_OF_MY_KEY”
最佳答案
首先,稍微清理一下代码以查看发生了什么情况会很有帮助。将逻辑移至文件顶部:
<%
config = Rails.application.secrets.stripe(['publishable_key'])
stripe_key = Rails.env.production? ? config.first[1] : config.second[1]
%>
...或者更好的是,一个助手:
def stripe_key
config = Rails.application.secrets.stripe(['publishable_key'])
Rails.env.production? ? config.first[1] : config.second[1]
end
然后,在您的 JavaScript 中:
var stripe = Stripe('<%= j(stripe_key) %>');
// ...or...
var stripe = Stripe(<%= stripe_key.to_json %>);
请注意两种情况下是否存在单引号。 j
helper将转义字符串中的特殊字符(包括引号和换行符),但返回的字符串不会用引号括起来,而 to_json
将返回已用双引号括起来的字符串。
附注当你这样说时:
Rails.application.secrets.stripe(['publishable_key'])
...您确定您的意思不是:
Rails.application.secrets.stripe['publishable_key']
# ...or...
Rails.application.secrets.stripe.publishable_key
关于javascript - 在 javascript 中创建接受 ruby 对象的多行字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43211138/