Railsアプリでgooglechartsgemを使用して、簡単なグラフを作成しています。私のアプリは常にSSL暗号化する必要があることを除けば、それは美しく機能します。グーグルチャートを引っ張るために、チャートジェムはもちろんグーグルにhttpリクエストを行います。これはほとんどのユーザーにとってページ上のいくつかの安全でないコンテンツについてのブラウザ警告につながります。他の誰かがこの問題に直面し、警告を回避するための解決策を考案しましたか?http呼び出しを行い、googleがローカルに返す画像を保存し、それをアプリに表示する方法を考え出す必要があるのではないかと思いますが、他の誰かがこれを処理するための優れた方法をすでに見つけていると考えました。
4 に答える
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 チャートは https 経由では機能しません。したがって、その方法は使用できません。Gchart クラスのメソッドは URL を返すだけなので、API 呼び出しサーバー側を実行し、選択したプロトコルを使用して ActionController 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] %>
コードはテストされていませんが、良いスタートが切れるはずです。
Google チャートは ssl をサポートするようになりました:
私は GchartRB gem を使用していますが、最初のソリューションの修正版も同様に機能しました。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') %>
ルートを設定するだけで、準備完了です。