我遇到过这几次。所以在 Rails 3 中,随着资产管道的引入,我们最好将 javascript 与视图分开。但是,如果我们想将一些实例变量从控制器转发到 javascript 怎么办?似乎唯一的解决方案是将javascript嵌入视图中。有没有办法解决这个问题?感觉就像,动态组件是不可能从视图中分离出来的。当我使用谷歌可视化 api 时,会时不时发生这种情况。我经常需要将大数据推送到 API 中。
谢谢
我遇到过这几次。所以在 Rails 3 中,随着资产管道的引入,我们最好将 javascript 与视图分开。但是,如果我们想将一些实例变量从控制器转发到 javascript 怎么办?似乎唯一的解决方案是将javascript嵌入视图中。有没有办法解决这个问题?感觉就像,动态组件是不可能从视图中分离出来的。当我使用谷歌可视化 api 时,会时不时发生这种情况。我经常需要将大数据推送到 API 中。
谢谢
您有三个主要选择:
嵌入式 JavaScript
就像您建议的那样,您可以<script>
在页面中嵌入一个标签,其内容是动态确定的。
DOM
有一个 hidden 是一种常见的做法<textarea>
,它的内容是某种数据(通常是 JSON)。在页面加载时,您可以使用 DOM 访问元素的 value 属性。
单独的 HTTP 请求
您可以让服务器提供您通过 XMLHttpRequest 或其他方式请求的 JSON 数据。
一种干净的方法是Gon gem。它专门用于“让你的 Rails 变量到你的 js”
有关其他一些选项,请参阅此railscasts 剧集(或阅读ASCIIcasts 成绩单)。
这很容易!
假设我们有一个控制器,其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 的数据函数会尝试将字符串隐式转换为合理的 javascript 对象。对于包含 JSON 字符串的数据属性,数据属性内的字符串将被转换为“javascript 对象”。
如果您不喜欢 的神奇行为,$.data
可以使用JSON.parse($("#self").attr("data-some_data"))
$("#self").data("some_data")