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

时间:2012-04-02 21:38:24

标签: javascript ruby-on-rails facebook instance-variables

我在 .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是什么。

对什么是最佳方法的想法?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您无法将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' )) %>");