如何在Rails项目中组织Javascript

时间:2012-09-02 02:55:31

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

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

由于

3 个答案:

答案 0 :(得分:2)

您有三个主要选择:

  1. 嵌入式JavaScript

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

  2. <强> DOM

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

  3. 单独的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"
}



<小时/> 注:您可能希望必须使用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's data function将尝试将字符串隐式转换为合理的javascript对象。对于包含JSON字符串的data属性,data属性中的字符串将转换为“javascript对象”。

如果您不喜欢$.data的神奇行为,可以使用JSON.parse($("#self").attr("data-some_data"))代替$("#self").data("some_data")