在HTTPS / SSL站点上使用Rails googlecharts gem

时间:2009-12-04 08:10:42

标签: ruby-on-rails gem google-visualization

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

4 个答案:

答案 0 :(得分:4)

API Google Charts API端点存储在Gchart类内的类变量@@url中。所以最初我想到monkeypatching类变量将url设置为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] %>

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

答案 1 :(得分:3)

Google图表现在支持ssl:

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

代替: http://chart.apis.google.com/chart

答案 2 :(得分:1)

我正在使用GchartRB gem,第一个解决方案的修改版本也适用于我。你必须使用to_escaped_url方法来为URI.parse正确处理它。

答案 3 :(得分: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') %>

只需设置你的路线就可以了。