2009-12-04 55 views
3

我在我的rails应用程序中使用googlecharts gem来制作一些简单的图表。它的工作非常好,除非我的应用程序需要随时进行SSL加密。为了拉动谷歌图表,图表宝石当然会向谷歌提出http请求,导致浏览器警告大多数用户页面上的某些不安全内容。有没有其他人面临这个问题,并设计了一个解决方案来避免这种警告?恐怕我需要找出一种方法来进行http调用,将图像存储在本地返回的google,然后在应用中显示该图片,但发现其他人已经找到了一种处理此问题的好方法。在HTTPS/SSL站点上使用Rails googlecharts gem

回答

4

API Google Charts API端点存储在Gchart类中的类变量@@url中。所以最初我想到monkeypatching类变量设置网址为https

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

alas Google Charts无法通过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] %> 

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

+0

对不起,反应迟钝,但这是完美的。做得太好了。 – Dan 2009-12-08 03:29:45

+0

欢迎你的家伙。 – 2009-12-08 03:32:25

+0

我试过这样做:Gchart.send:class_variable_set,:@@ url,“https://chart.googleapis.com/chart?“ 在名为google_charts的初始化程序中,但似乎图书馆一直在从http://chart.apis.google.com/chart加载它 - 我是否需要执行其他操作? – 2012-04-11 17:11:55

0

我不知道现有的插件会这样做,但你可以自己做。简单地写一个新的控制器方法,将通过HTTP GET图表,然后立即返回它(不需要将它保存到一个文件)

在控制器:

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') %> 

只需设置你的路线,你就全部设置好了。

+0

的Net :: HTTP.get不会字符串作为参数工作。它需要是URI :: HTTP的实例或响应主机的类似对象。 – 2009-12-05 03:15:41

1

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