3

Railsアプリでgooglechartsgemを使用して、簡単なグラフを作成しています。私のアプリは常にSSL暗号化する必要があることを除けば、それは美しく機能します。グーグルチャートを引っ張るために、チャートジェムはもちろんグーグルにhttpリクエストを行います。これはほとんどのユーザーにとってページ上のいくつかの安全でないコンテンツについてのブラウザ警告につながります。他の誰かがこの問題に直面し、警告を回避するための解決策を考案しましたか?http呼び出しを行い、googleがローカルに返す画像を保存し、それをアプリに表示する方法を考え出す必要があるのではないかと思いますが、他の誰かがこれを処理するための優れた方法をすでに見つけていると考えました。

4

4 に答える 4

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] %>

コードはテストされていませんが、良いスタートが切れるはずです。

于 2009-12-04T17:00:11.373 に答える
3

Google チャートは ssl をサポートするようになりました:

https://chart.googleapis.com/chartを使用

代わりに: http://chart.apis.google.com/chart

于 2011-03-07T15:57:12.063 に答える
1

私は GchartRB gem を使用していますが、最初のソリューションの修正版も同様に機能しました。URI.parse を正しく処理するには、to_escaped_url メソッドを使用する必要があります。

于 2010-11-18T19:33:56.510 に答える
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') %>

ルートを設定するだけで、準備完了です。

于 2009-12-04T14:25:07.523 に答える