我知道有两种方法可以将控制器(/ 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扩展名是有道理的:用户在第一次点击控制器中的任何操作/视图时对其进行缓存。然后,当他们浏览到不同的页面时,他们不必下载文件的不同版本。我是对的吗?
答案 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 文件中定义控制器的路径。