Я использую gogle googlecharts в своем приложении rails для некоторых простых графиков. Он работает красиво, за исключением того, что мое приложение требуется для шифрования SSL в любое время. Для того, чтобы вытащить диаграммы Google, диаграмма gem, конечно же, делает HTTP-запрос для google, что приводит к предупреждению браузера о некоем небезопасном контенте на странице для большинства пользователей. Кто-нибудь еще столкнулся с этой проблемой и разработал решение, чтобы избежать предупреждения? Я боюсь, мне нужно будет выяснить способ сделать http-вызов, сохранить изображение google возвращается локально, а затем отобразить это в приложении, но подумал, что кто-то еще нашел хороший способ справиться с этим.Использование Rails googlecharts gem на сайте HTTPS/SSL
ответ
Конечная точка 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] %>
код не тестировался, но должен дать вам хорошее начало.
Я не знаю о существующем плагине, который сделает это, но вы можете сделать это самостоятельно. Просто напишите новый метод контроллера, который получит диаграмму через 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') %>
Просто настройте свой маршрут, и все готово.
Net :: HTTP.get не будет работать со строкой в качестве аргумента. Это должен быть экземпляр URI :: HTTP или аналогичный объект, который отвечает на хост. –
Я использую драгоценный камень GchartRB, и модифицированная версия первого решения работала и на меня. Вам нужно будет использовать метод to_escaped_url для URI.parse для правильной обработки.
Google карты теперь поддерживает SSL:
использование https://chart.googleapis.com/chart
Можете ли вы показать, где Google заявляет, что теперь карты поддерживают SSL? –
Извините за медленный ответ, но это работает отлично. Очень хорошо сделано. – Dan
приветствую чувака. –
Я пробовал сделать это: Gchart.send: class_variable_set,: @@ url, "https://chart.googleapis.com/chart?" в инициализаторе, названном google_charts, но, похоже, библиотека продолжает загружать его с http://chart.apis.google.com/chart. Нужно ли мне что-то делать? –