在javascript中创建一个接受ruby对象的多行字符串

时间:2017-04-04 15:12:40

标签: javascript ruby-on-rails ruby erb

所以我想让我的代码与Stripe的js例子匹配:

var stripe = Stripe('pk_test_REST_OF_MY_KEY');

以下是我的.js.erb文件中从我的secrets.yml文件调用右键的行。当这呈现时,我在浏览器控制台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"

2 个答案:

答案 0 :(得分:1)

我想我应该是:

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 %>
);

答案 1 :(得分:1)

首先,稍微清理一下代码会有所帮助,看看发生了什么。将逻辑移到文件顶部:

<%
  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将返回一个已用双重字符串包裹的字符串。引号。

P.S。当你这样说:

Rails.application.secrets.stripe(['publishable_key'])

......你确定不是这个意思:

Rails.application.secrets.stripe['publishable_key']

# ...or...

Rails.application.secrets.stripe.publishable_key