Rails:使用ERB减慢页面将控制器变量传递给JS?

时间:2014-10-02 09:54:51

标签: javascript jquery ruby-on-rails ruby ruby-on-rails-3

我知道有两种方法可以将控制器(/ action)中定义的变量传递给JS ...

官方方式是

.js.erb

var banana = "<% @banana %>"

另一种方式(我目前使用的是)

.html.erb

<span id="banana-variable" style="display:none"><% @banana %></span>

的.js

var banana = $("#banana-variable").html()

此js文件加载到控制器上的多个操作/视图中。我不使用.erb扩展名是有道理的:用户在第一次点击控制器中的任何操作/视图时对其进行缓存。然后,当他们浏览到不​​同的页面时,他们不必下载文件的不同版本。我是对的吗?

4 个答案:

答案 0 :(得分:5)

是的,是对的。 javascript将缓存在客户端的浏览器中。

您仍然希望在&#39; js&#39;上发送数据。或脚本文件,你可以使用这个名为Gon的宝石。

答案 1 :(得分:2)

http://railscasts.com/episodes/324-passing-data-to-javascript

我建议您使用gem&#39; gon&#39;,这是在RailsCast中彻底介绍的。它使您的控制器更清洁。如果您尝试将数组或散列传递给js,那么您的方法会更麻烦。

答案 2 :(得分:1)

我认为您的问题是您正在使用<% %>来执行代码,而不是<%= %>执行代码而结果重新生成模板

答案 3 :(得分:0)

使用Gon,您只能在加载html页面后访问该页面。据我所知,它使用网页作为代理将数据从rails服务器传输到javascript 但是如果你想在你想要的任何时间点使用变量,你可以从javascript到rails控制器执行ajax(post)请求并将值检索为json。

示例:

AJAX请求:

$.ajax({
        type: "POST",
        url: <PageURL>,
        async: false,
        dataType: 'application/json',
        success: function(data){
          data = JSON.parse(data);
        },
      });

您的&#34;数据&#34;将包含返回的值。

在控制器端,它应该是:

控制器:

def <PageURL>
    render :json => {:result => <value_you_want_to_return>}
end


不要忘记在 routes.rb 文件中定义控制器的路径。