我遇到过这几次。因此在rails 3中,随着资产管道的引入,我们更好地将javascript与视图分开。但是,如果我们想将一些实例变量从控制器转发到javascript呢?似乎唯一的解决方案是在视图中嵌入javascript。有什么方法可以解决这个问题吗?感觉就像,动态组件不可能与视图分离。当我使用谷歌可视化API时,这种情况时有发生。我经常需要将大数据推送到api中。
由于
答案 0 :(得分:2)
您有三个主要选择:
嵌入式JavaScript
与您建议的一样,您可以在页面中嵌入<script>
标记,其内容是动态确定的。
<强> DOM 强>
通常的做法是拥有一个隐藏的<textarea>
,其内容是某种数据(通常是JSON)。在页面加载时,您可以使用DOM来访问元素的value属性。
单独的HTTP请求
您可以让服务器提供您通过XMLHttpRequest或其他方式请求的JSON数据。
答案 1 :(得分:2)
一种干净的方法是Gon gem。它专门用于“将你的Rails变量变为你的js”
有关其他一些选项,请参阅此railscasts episode(或阅读ASCIIcasts transcript)。
答案 2 :(得分:1)
这很简单!
假设我们有一个控制器,其中包含 index.html.erb
的以下视图#GET /index.html
def index
@some_data = {:foo => [:bar0, :bar1]}
end
在我们的视图中( index.html.erb ),我们会先将数据嵌入HTML中
<%= javascript_include_tag "index" %>
<div id="home_page">
<!-- Pass members to javascript -->
<div id="self" data-some_data='<%= @some_data.to_json %>'></div>
</div>
最后,假设我们使用的是jQuery,我们只需访问 index.js 中的数据。
$(document).ready(function() {
some_data = $("#self").data("some_data");
alert(some_data.foo[0]); //Says "bar0"
}
$(document).ready(function() {
//This will fail
some_data = JSON.parse($("#self").data("some_data"));
alert(some_data.foo[0]); //Says "bar0"
}
但是,使用JSON.parse 将无法正常工作。来自JSON.parse的返回信息不是必然一个字符串,在这种情况下,它是一个javascript对象; jQuery's data function将尝试将字符串隐式转换为合理的javascript对象。对于包含JSON字符串的data属性,data属性中的字符串将转换为“javascript对象”。
如果您不喜欢$.data
的神奇行为,可以使用JSON.parse($("#self").attr("data-some_data"))
代替$("#self").data("some_data")