Usando Rails GoogleCharts Gem no site HTTPS/SSL
-
12-09-2019 - |
Pergunta
Estou usando o aplicativo GoogleCharts Gem no meu Rails para obter um gráfico simples. Funciona lindamente, exceto que meu aplicativo deve ser criptografado o tempo todo. Para puxar os gráficos do Google, o Garts Gem, é claro, faz uma solicitação HTTP para o Google, que leva a um aviso de navegador sobre algum conteúdo inseguro na página para a maioria dos usuários. Alguém mais enfrentou esse problema e desenvolveu uma solução para evitar o aviso? Receio ter precisado descobrir uma maneira de fazer a chamada HTTP, armazenar a imagem que o Google retorna localmente e depois exibi -la no aplicativo, mas imaginei que alguém já encontrou uma boa maneira de lidar com isso.
Solução
O ponto final da API da API Google Gráficos é armazenado na variável de classe @@url
Dentro da classe GChart. Então, inicialmente, pensei em Monkeypatching a variável de classe para definir o URL como HTTPS
# Put this in an initializer
Gchart.send :class_variable_set, :@@url, "https://chart.apis.google.com/chart?"
Infelizmente, os gráficos do Google não funcionam via HTTPS. Portanto, não podemos usar esse método. Como os métodos da classe GChart apenas retornam um URL, podemos encerrar as chamadas em um método do controlador de proxy que faz o lado do servidor de chamadas da API e o proxies para o cliente através do método ActionController send_data usando seu protocolo de escolha. Dessa forma, você não precisa reinventar a roda da biblioteca 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
O ajudante que você pode usar em seus pontos de vista:
module ApplicationHelper
def chart_tag(options ={})
image_tag chart_path(options)
end
end
e a rota
map.resource :chart, :only => :show
Uso:
<%= 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] %>
O código não foi testado, mas deve dar um bom começo.
Outras dicas
O Google Gráficos suporta agora SSL:
usarhttps://chart.googleapis.com/Chart
ao invés de :http://chart.apis.google.com/Chart
Estou usando a gem Gchartrb e uma versão modificada da primeira solução funcionou para mim também. Você terá que usar o método to_escaped_url para que o URI.PARSE lidar com isso corretamente.
Não conheço um plug -in existente que faça isso, mas você pode fazê -lo por conta própria. Basta escrever um novo método de controlador que obtenha o gráfico via HTTP e depois o retorne imediatamente (sem necessidade de salvá -lo em um arquivo)
No controlador:
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
Em vista:
<%= image_tag googlechart_path(:api=>'cht=p&chd=s:Uf9a&chs=200x100&chl=January') %>
Basta configurar sua rota e você está pronto.