HTTPS/SSL 사이트에서 Rails GoogleCharts 보석을 사용합니다
-
12-09-2019 - |
문제
간단한 차트를 위해 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을 지원합니다.
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') %>
경로를 설정하면 모두 설정됩니다.