我用我的Rails应用程序对于一些简单的图表中googlecharts宝石。它精美的作品,除了我的应用程序需要在任何时候都SSL加密。为了拉谷歌图表,当然图表宝石发出HTTP请求传送给Google,导致浏览器警告的页面上,不安全的内容,大多数用户使用。有没有其他人遇到这个问题,并想出了一个解决方案,以避免该警告?我怕我会需要找出一种方法,使HTTP调用,存储图像谷歌本地返回,然后显示在应用程序,但想通别人已经找到了一个不错的方式来处理这个问题。

有帮助吗?

解决方案

在API谷歌图表API端点被存储在Gchart类内的类变量@@url。所以最初我想的Monkeypatching类变量设置URL为https

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

唉谷歌图表不通过https工作。因此,我们不能用这种方法。由于Gchart类方法只返回一个URL,我们可以在通过使用您选择的协议ActionController的SEND_DATA方法执行API调用服务器端和代理到客户端的代理控制器的方法包裹起来的调用。这样,你就不必重新发明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] %>

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

其他提示

谷歌图表支持现在SSL:

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

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

我使用的是GchartRB宝石,而第一种水溶液的修改后的版本为我工作为好。你将不得不使用to_escaped_url方法URI.parse正确处理它。

我不知道现有的插件,将做到这一点的,但你可以做你自己。简单地写一个新的控制器的方法,将通过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') %>

刚刚成立的路线,就这么简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top