Usando Rails googlecharts joya en HTTPS/SSL sitio
-
12-09-2019 - |
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.
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.