在脚本标记中使用Ruby变量

时间:2014-09-24 15:20:06

标签: javascript ruby-on-rails ruby

我正在我的rails控制器中定义一个内部通信事件,如下所示:

object_controller.rb

@object.save
@intercom_event = 'object-saved'

在我的application.html.erb中存在的部分内容我正在尝试运行此脚本:

<script>
  Intercom('trackEvent', '<%= @intercom_event %>');
</script>

脚本运行并将事件发送到Intercom,就像它应该的那样。我以为我正在将ruby变量正确放入<script>标记,除了@intercom_event的输出为:<%= @intercom_event %>时应该是:object-saved

此外,如果我将此<script>标记包装在if语句中(以便每次重新加载页面时都不发送事件),如下所示:

<% if @intercom_event.present? %>
  <script>
    Intercom('trackEvent', '<%= @intercom_event %>');
  </script>
<% end %>

即使定义了@intercom_event,它也会完全忽略脚本。

2 个答案:

答案 0 :(得分:2)

通过查看params是否存在而不是@intercom_event变量来实现它的工作

<% if params[:intercom].present? %>
  <script>
    Intercom('trackEvent', '<%= params[:intercom] %>');
  </script>
<% end %>

答案 1 :(得分:0)

你走在正确的轨道上:

<%- if @intercom_event.present? -%>
  <%= javscript_tag do -%>
    Intercom('trackEvent', '<%=j @intercom_event %>');
  <%- end -%>
<%- end -%>

j方法为JavaScript上下文转义,例如HTML的伴随方法h转义。这对于避免脚本错误很重要。

对于更复杂的结构,@intercom_event.to_json会为您提供JavaScript兼容的表示。