3

我在我的 rails 应用程序中使用 googlecharts gem 来制作一些简单的图表。它工作得很好,除了我的应用程序需要始终进行 SSL 加密。为了提取 google 图表,charts gem 当然会向 google 发出一个 http 请求,这会导致浏览器警告大多数用户在页面上存在一些不安全的内容。有没有其他人遇到过这个问题并设计了一个解决方案来避免警告?恐怕我需要找到一种方法来进行 http 调用,将谷歌返回的图像存储在本地,然后在应用程序中显示它,但我认为其他人已经找到了一种很好的方法来处理这个问题。

4

4 回答 4

4

API Google Charts API 端点存储在@@urlGchart 类内的类变量中。所以最初我想到猴子修补类变量以将 url 设置为 https

# Put this in an initializer
Gchart.send :class_variable_set, :@@url, "https://chart.apis.google.com/chart?"

唉,谷歌图表不能通过 https 工作。所以我们不能使用那个方法。由于 Gchart 类方法只返回一个 URL,我们可以将调用包装在代理控制器方法中,该方法执行 API 调用服务器端并使用您选择的协议通过 ActionController send_data 方法将其代理到客户端。这样您就不必重新发明 Gchart 库的轮子。

class ChartsController < ApplicationController
  require 'net/http'
  require 'gchart'

  def show
    options = params.except :controller, :action
    options[:data].map! { |x| x.to_i } if options[:data]
    begin 
      chart = URI.parse(Gchart.send options.delete(:type), options)
      send_data Net::HTTP.get(chart), :content_type => 'image/png', :disposition  => 'inline'
    rescue
      raise ActiveRecord::RecordNotFound
    end
  end

end

您可以在视图中使用的助手:

module ApplicationHelper

  def chart_tag(options ={})
    image_tag chart_path(options)
  end

end

和路线

map.resource :chart, :only => :show

用法:

<%= chart_tag :type => "line", :size => '200x300', :title => "example title", :bg => 'efefef', :legend => ['first data set label', 'second data set label'], :data => [10, 30, 120, 45, 72] %>

代码未经测试,但应该给你一个好的开始。

于 2009-12-04T17:00:11.373 回答
3

谷歌图表现在支持 ssl :

使用 https://chart.googleapis.com/chart

而不是: http ://chart.apis.google.com/chart

于 2011-03-07T15:57:12.063 回答
1

我正在使用 GchartRB gem,第一个解决方案的修改版本也对我有用。您必须使用 URI.parse 的 to_escaped_url 方法才能正确处理它。

于 2010-11-18T19:33:56.510 回答
0

我不知道现有的插件可以做到这一点,但你可以自己做。只需编写一个新的控制器方法,该方法将通过 HTTP 获取图表,然后立即返回(无需将其保存到文件中)

在控制器中:

require 'net/http'
def googlechart
  send_data Net::HTTP.get("http://chart.apis.google.com/chart?#{params[:api]}"),
    :content_type => 'image/png',
    :disposition  => 'inline'
end

鉴于:

<%= image_tag googlechart_path(:api=>'cht=p&chd=s:Uf9a&chs=200x100&chl=January') %>

只需设置您的路线,一切就绪。

于 2009-12-04T14:25:07.523 回答