문제

간단한 차트를 위해 Rails 앱에 GoogleCharts Gem을 사용하고 있습니다. 내 앱이 항상 SSL을 암호화해야한다는 점을 제외하고는 아름답게 작동합니다. Google 차트를 가져 오기 위해 차트 보석은 물론 Google에 HTTP 요청을하여 대부분의 사용자에게 페이지의 불안한 콘텐츠에 대한 브라우저 경고로 이어집니다. 다른 사람 이이 문제에 직면하고 경고를 피하기위한 해결책을 고안 했습니까? HTTP를 호출하고 Google이 로컬로 돌아 오는 이미지를 저장 한 다음 앱에 표시하는 방법을 알아내는 방법을 찾아야하지만 다른 사람이 이미이 처리를 처리 할 수있는 좋은 방법을 찾았다 고 생각합니다.

도움이 되었습니까?

해결책

API Google 차트 API 엔드 포인트는 클래스 변수에 저장됩니다. @@url GCHART 클래스 내부. 그래서 처음에는 URL을 https로 설정하기 위해 클래스 변수를 monkeypatching을 생각했습니다.

# Put this in an initializer
Gchart.send :class_variable_set, :@@url, "https://chart.apis.google.com/chart?"

ALAS 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을 지원합니다.

사용https://chart.googleapis.com/chart

대신에 :http://chart.apis.google.com/chart

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') %>

경로를 설정하면 모두 설정됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top