Rails:从非内联JS访问实例变量

Rails: Accessing instance variable from not inline JS

本文关键字:JS 访问 实例 变量 Rails      更新时间:2023-09-26

我在.html.erb文件中有这段代码:

<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>
<script>
  FB.Event.subscribe('edge.create',
      function(response) {
          send_fb_like();
      }
  );
  FB.Event.subscribe('edge.remove',
      function(response) {
          send_fb_unlike();
      }
  );
  function send_fb_like()
  {
    var business_name = '<%= @consumer.name %>';
    alert("You liked"+consumer_name);
  }
  function send_fb_unlike()
  {
    var business_name = '<%= @consumer.name %>';
    alert("You unliked"+consumer_name);
  }
</script>

这工作正常,我可以正确访问@consumer.name。但是,如果我将其更改为:

facebook_consumer.js如下所示:

$(function(){
FB.Event.subscribe('edge.create',
          function(response) {
              send_fb_like();
          }
      );
      FB.Event.subscribe('edge.remove',
          function(response) {
              send_fb_unlike();
          }
      );
      function send_fb_like()
      {
        var business_name = '<%= @consumer.name %>';
        alert("You liked"+consumer_name);
      }
      function send_fb_unlike()
      {
        var business_name = '<%= @consumer.name %>';
        alert("You unliked"+consumer_name);
      }

});

它会转储这个:

你喜欢<%= @consumer.name %>。我试着将文件保存为js.erb,但它似乎不知道@consumer是什么。

对什么是最好的方法有什么想法吗?

您最好的选择可能是创建一个应用程序范围的JS对象来存储您需要的值。在页面顶部,您可以向该对象添加元素,这些元素将可用于链接的脚本。

<script type="text/javascript">
    app = app || {}
    app.keyName1 = "<%= @variable1 %>";
    app.keyName2 = "<%= @variable2 %>";
</script>

您不能将Ruby代码内联到.js文件中。如果您想使用Ruby代码,您需要创建一个.js.erb文件,然后在其中呈现一个部分。

# controller
render :partial => "/path/to/js/partial.js.erb"
# inside your JS partial
# you can use <%= @consumer.name %> freely in this file
# and then add the line below to render your normal html.erb file
$("#reviews").append("<%= escape_javascript(render(:partial => '/path/to/partial.html.erb' )) %>");