Rails:尝试在开发模式下“非法”将 adv ruby​​(每个 + 迭代器)操作嵌入到 javascript(Google Charts API)中

Posted

技术标签:

【中文标题】Rails:尝试在开发模式下“非法”将 adv ruby​​(每个 + 迭代器)操作嵌入到 javascript(Google Charts API)中【英文标题】:Rails: trying to embed an adv ruby (each + iterator) operation into javascript (Google Charts API) after hacking it together "illegally" in dev mode 【发布时间】:2012-09-03 23:44:37 【问题描述】:

我的应用程序,现在处于生产模式,必须成长并面对这样一个现实,即我的一些视图的开发模式代码,我将数据(迭代地)嵌入到 Google Charts API javascript 代码中以获得一些覆盖的甜蜜地图用我的数据,需要认真检查。

代码是这样的:

<h1>US Map of Startup Density</h1>

<% i = 0 %>

 <script type='text/javascript'>
   google.load('visualization', '1', 'packages': ['geochart']);
   google.setOnLoadCallback(drawMarkersMap);

   function drawMarkersMap() 
   var data = google.visualization.arrayToDataTable([
    ['Location', 'Startups'],
    <% @locations.count.times do %>
                [<%= "'#@locations[i].name', #@locations[i].d_s" %>],
         <% i += 1 ;end %>

 ]);

  var options = 
   region: 'US',
   resolution: 'provinces',
   displayMode: 'markers',
   magnifyingGlass: enable: true, zoomFactor: 9.0,
   colorAxis: colors: ['green', 'blue']
 ;

  var chart = new google.visualization.GeoChart(document.getElementById('chart_div'));
  chart.draw(data, options);
;
</script>
</head>
<body>
<h4>All cities with less than 10 startups have been exempted from this graph.</h4>
 <div id="chart_div" style="width: 900px; height: 500px;"></div>

而且,正如您可能立即注意到的那样,我通过将 ruby​​ 直接嵌入到 javascript 中犯了几个“禁忌”。当时,我对此一无所知,并且对它甚至起作用感到相当惊讶。但确实如此。现在我想知道如何才能在生产模式下将这张地图提供给大众。因为 javascript 编译(我什至试图在 production.rb 中将其关闭)过程似乎会混淆 javascript 并使其无法被 Google 读取。

感谢观看

我考虑过使用 gon gem,但我想知道如何考虑到这种复杂程度 --- 我不想只是手动将每条数据作为单独的实例变量放入控制器中...... 我考虑过尝试用 javascript 处理这个东西,但我并不真正了解 javascript。然后是 ActiveRecord 调用来处理.. 我考虑过禁用 javascript 资产编译,但到目前为止还没有成功。不过我可能做错了。我只尝试禁用在 production.rb 中编译的资产。

【问题讨论】:

【参考方案1】:

我认为最明显的做法是将您的 Locations 资源公开为 API,然后进行 AJAX 调用以将其作为 JSON 加载。然后,您可以遍历该 JSON 对象并从中提取您从 ActiveRecord 获取的所有数据。

所以,在您的 LocationsController 中:

class LocationsController < ApplicationController
   respond_to :html, :json

   def index
      respond_with Location.all
   end

   ...
end

这将使您的 Locations 资源响应以 JSON 或 HTML 格式请求数据的调用。我把 HTML 留在了那里,因为我假设您可以从浏览器访问位置列表,如果不能,您可以从 respond_to 中删除 :html

现在您可以使用 jQuery 轻松地从 JavaScript 中提取此位置数据:

<script type='text/javascript'>
  google.load('visualization', '1', 'packages': ['geochart']);
  google.setOnLoadCallback(drawMarkersMap);

  function drawMarkersMap() 
    $.ajax( url: '/locations', dataType: 'json' )
        .done(function(data) 
            // Now you have the same data as before in a JSON object, so you will still need to format it
        
    );

     var options = 
      region: 'US',
      resolution: 'provinces',
      displayMode: 'markers',
      magnifyingGlass: enable: true, zoomFactor: 9.0,
      colorAxis: colors: ['green', 'blue']
    ;

     var chart = new google.visualization.GeoChart(document.getElementById('chart_div'));
     chart.draw(data, options);
;
</script>

ajax 调用以 JavaScript 可以轻松解释的 JSON 格式请求您的 Location 资源。最后一步,您需要将 JSON 格式的数据转换为 Google Charts 接受的相同格式,但这应该是一个好的开始。

我希望我没有遗漏一些复杂性,但这看起来是一件非常简单的事情。毕竟,这种场景是 Rails 最擅长的事情之一。

【讨论】:

我想我可以用这个破解一些东西。谢谢!

以上是关于Rails:尝试在开发模式下“非法”将 adv ruby​​(每个 + 迭代器)操作嵌入到 javascript(Google Charts API)中的主要内容,如果未能解决你的问题,请参考以下文章

Rails生产方式的乘客

RAILS 轨道资产:预编译失败

ruby 在开发模式下访问子域。 Rails 3

Rails 没有在开发模式下重新加载我的模型

如何在生产模式下修复 Rails 的路由错误?

如何在 Rails 中引发异常,使其表现得像其他 Rails 异常?