HTTPS / SSLサイト上のRails googlecharts宝石を使用して
-
12-09-2019 - |
質問
私はいくつかの簡単なチャート作成のための私のレールのアプリでgooglechartsの宝石を使用しています。それは私のアプリは常に暗号化SSLであることが要求されることを除いて、見事に動作します。 Googleのチャートを引き出すためには、当然のチャートの宝石はほとんどのユーザーのためのページ上のいくつかの安全でないコンテンツに関する警告ブラウザにつながるGoogleにHTTP要求を行います。誰がこの問題に直面し、警告を回避するためのソリューションを考案していますか?私は、HTTP呼び出しを作るための方法を把握する必要があり、Googleはローカルに返す画像を保存して、アプリでそれを表示します怖いですが、他の誰かがすでにこれを処理するための良い方法を見つけた考え出します。
解決
API GoogleのチャートAPIエンドポイントはGchartクラスの内部クラス変数@@url
に格納されます。だから、最初は私は、HTTPS
# Put this in an initializer
Gchart.send :class_variable_set, :@@url, "https://chart.apis.google.com/chart?"
Googleのチャート悲しいかな、HTTPS経由では動作しません。だから我々は、そのメソッドを使用することはできません。 Gchartクラスのメソッドは、単にURLを返すとして、我々は選択のあなたのプロトコルを使用してActionController SEND_DATAメソッドを介してAPIコールサーバ側とクライアントへのプロキシそれをしないプロキシコントローラメソッドで呼び出しをラップすることができます。その方法は、あなたが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] %>
コードがテストされていないですが、あなたに良いスタートを与える必要があります。
他のヒント
Googleのチャートは、現在、SSLをサポートしています:
私はGchartRBの宝石を使用していて、第1の溶液の修正版は、同様に私のために働きました。あなたはそれを正しく処理するためにURI.parseためto_escaped_urlメソッドを使用する必要があります。
私はこれを行うだろう、既存のプラグインを知りませんが、あなたは自分でそれを行うことができます。単に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') %>
ちょうどあなたのルートを設定し、あなたはすべてのセットです。