Использование Rails googlecharts gem на сайте HTTPS / SSL - PullRequest
3 голосов
/ 04 декабря 2009

Я использую самоцвет googlecharts в своем приложении rails для простого построения графиков. Это работает прекрасно, за исключением того, что мое приложение должно быть зашифровано SSL все время. Чтобы вытащить диаграммы Google, самоцвет диаграмм, конечно же, отправляет http запрос к Google, что приводит к предупреждению браузера о некотором небезопасном контенте на странице для большинства пользователей. Кто-нибудь еще сталкивался с этой проблемой и придумал решение, чтобы избежать предупреждения? Боюсь, мне нужно будет найти способ сделать http-вызов, сохранить изображение, возвращаемое Google, и затем отобразить его в приложении, но решил, что кто-то другой уже нашел хороший способ справиться с этим.

Ответы [ 4 ]

4 голосов
/ 04 декабря 2009

Конечная точка API Google Charts API хранится в переменной класса @@url внутри класса Gchart. Поэтому изначально я думал о том, чтобы установить переменную класса, чтобы установить URL-адрес https

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

увы Google Charts не работает через https. Поэтому мы не можем использовать этот метод. Так как методы класса Gchart просто возвращают URL-адрес, мы можем заключить вызовы в метод прокси-контроллера, который выполняет API-вызов на стороне сервера и передает его клиенту через метод Action_ontroller 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] %>

Код не проверен, но должен дать вам хорошее начало.

3 голосов
/ 07 марта 2011

Google charts теперь поддерживает ssl:

использование https://chart.googleapis.com/chart

вместо: http://chart.apis.google.com/chart

1 голос
/ 18 ноября 2010

Я использую гем GchartRB, и модифицированная версия первого решения также сработала для меня. Вам придется использовать метод to_escaped_url для URI.parse, чтобы правильно его обработать.

0 голосов
/ 04 декабря 2009

Я не знаю существующего плагина, который будет это делать, но вы можете сделать это самостоятельно. Просто напишите новый метод контроллера, который получит диаграмму по 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') %>

Просто настройте свой маршрут, и все готово.

...