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