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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top