2009-12-04 5 views
3

Я использую gogle googlecharts в своем приложении rails для некоторых простых графиков. Он работает красиво, за исключением того, что мое приложение требуется для шифрования SSL в любое время. Для того, чтобы вытащить диаграммы Google, диаграмма gem, конечно же, делает HTTP-запрос для google, что приводит к предупреждению браузера о некоем небезопасном контенте на странице для большинства пользователей. Кто-нибудь еще столкнулся с этой проблемой и разработал решение, чтобы избежать предупреждения? Я боюсь, мне нужно будет выяснить способ сделать http-вызов, сохранить изображение google возвращается локально, а затем отобразить это в приложении, но подумал, что кто-то еще нашел хороший способ справиться с этим.Использование Rails googlecharts gem на сайте HTTPS/SSL

ответ

4

Конечная точка API API Google Chart хранится в переменной класса @@url внутри класса Gchart. Так что изначально я думал monkeypatching переменного класса, чтобы установить 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-вызова, и проксирует его клиенту с помощью метода send_data ActionController, используя ваш протокол выбора. Таким образом, вам не нужно изобретать колесо библиотеки 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] %> 

код не тестировался, но должен дать вам хорошее начало.

+0

Извините за медленный ответ, но это работает отлично. Очень хорошо сделано. – Dan

+0

приветствую чувака. –

+0

Я пробовал сделать это: Gchart.send: class_variable_set,: @@ url, "https://chart.googleapis.com/chart?" в инициализаторе, названном google_charts, но, похоже, библиотека продолжает загружать его с http://chart.apis.google.com/chart. Нужно ли мне что-то делать? –

0

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

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

+0

Net :: HTTP.get не будет работать со строкой в ​​качестве аргумента. Это должен быть экземпляр URI :: HTTP или аналогичный объект, который отвечает на хост. –

1

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