Pregunta

Yo estoy usando la googlecharts joya en mi aplicación rails para algunos sencillos gráficos.Funciona de maravilla, excepto que mi aplicación se requiere para ser cifrado SSL en todo momento.Para tirar del google gráficos, los gráficos de la gema, por supuesto, hace una petición http a google que conduce a un navegador de advertencia acerca de algún contenido inseguro en la página de la mayoría de los usuarios.Ha nadie se enfrentaron a este problema y encontró una solución para evitar la advertencia?Me temo que tendrá que encontrar una manera para hacer la llamada http, almacén de la imagen de google devuelve a nivel local, y, a continuación, mostrar que en la app, pero pensé que alguien ya ha encontrado una buena manera de manejar esto.

¿Fue útil?

Solución

La API de Google Charts extremo de API se almacena en la variable de clase @@url dentro de la Gchart clase.Por lo que inicialmente pensé en monkeypatching la variable de clase para establecer la dirección url https

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

por desgracia Google Charts no funciona a través de https.Así que no podemos usar ese método.Como el Gchart métodos de la clase acabo de volver de una URL que podemos ajustar las llamadas en un proxy de controlador método que hace la llamada a la API del lado de servidor proxy y al cliente a través de la ActionController send_data método para el uso de su protocolo de elección.De esa manera usted no tiene que reinventar la Gchart de la biblioteca de la rueda.

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

El ayudante puede utilizar en sus puntos de vista:

module ApplicationHelper

  def chart_tag(options ={})
    image_tag chart_path(options)
  end

end

y la ruta

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] %>

El código es probado, pero debe dar un buen comienzo.

Otros consejos

Los gráficos de Google apoya ahora SSL:

uso https://chart.googleapis.com/chart

en lugar de: http://chart.apis.google.com/chart

Estoy usando la gema GchartRB, y una versión modificada de la primera solución que funcionó para mí también. Vas a tener que utilizar el método de to_escaped_url URI.parse manejarlo correctamente.

No sé de un plugin existente que va a hacer esto, pero usted puede hacerlo por su cuenta. Basta con escribir un nuevo método de controlador que conseguir la carta a través de HTTP y luego regresar inmediatamente (sin necesidad de guardarlo en un archivo)

En el regulador:

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

A la vista:

<%= image_tag googlechart_path(:api=>'cht=p&chd=s:Uf9a&chs=200x100&chl=January') %>

Sólo hay que establecer su ruta y ya está todo listo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top