0

我遇到过这几次。所以在 Rails 3 中,随着资产管道的引入,我们最好将 javascript 与视图分开。但是,如果我们想将一些实例变量从控制器转发到 javascript 怎么办?似乎唯一的解决方案是将javascript嵌入视图中。有没有办法解决这个问题?感觉就像,动态组件是不可能从视图中分离出来的。当我使用谷歌可视化 api 时,会时不时发生这种情况。我经常需要将大数据推送到 API 中。

谢谢

4

3 回答 3

2

您有三个主要选择:

  1. 嵌入式 JavaScript

    就像您建议的那样,您可以<script>在页面中嵌入一个标签,其内容是动态确定的。

  2. DOM

    有一个 hidden 是一种常见的做法<textarea>,它的内容是某种数据(通常是 JSON)。在页面加载时,您可以使用 DOM 访问元素的 value 属性。

  3. 单独的 HTTP 请求

    您可以让服务器提供您通过 XMLHttpRequest 或其他方式请求的 JSON 数据。

于 2012-09-02T03:04:16.757 回答
2

一种干净的方法是Gon gem。它专门用于“让你的 Rails 变量到你的 js”

有关其他一些选项,请参阅此railscasts 剧集(或阅读ASCIIcasts 成绩单)。

于 2012-09-02T03:18:16.740 回答
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"
}




注意:您可能会期望必须使用 JSON.parse,因为它具有神奇的能力,可以像使用对象一样使用返回的数据,而不仅仅是纯字符串,例如:

$(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")

于 2013-09-20T22:37:14.157 回答