باستخدام القضبان Googlecharts Gem على موقع HTTPS / SSL
-
12-09-2019 - |
سؤال
أنا أستخدم GoogleCharts Gem في تطبيق القضبان الخاص بي لبعض الرسوم البيانية البسيطة. يعمل بشكل جميل، باستثناء تطبيقي مطلوب أن يكون SSL مشفرة في جميع الأوقات. من أجل سحب مخططات Google، يقوم Greats Gemicial بالطبع بإجراء طلب HTTP إلى Google يؤدي إلى تحذير متصفح حول بعض المحتوى غير الآمن على الصفحة لمعظم المستخدمين. هل واجه أي شخص آخر هذه القضية ووضع حلا لتجنب التحذير؟ أخشى أنني سأحتاج إلى اكتشاف طريقة لجعل مكالمة HTTP، تخزين صورة Google إرجاع محليا، ثم عرض ذلك في التطبيق ولكنه احسب شخصا آخر قد وجد وسيلة لطيفة بالفعل للتعامل مع هذا.
المحلول
يتم تخزين Api Google Charts API Endpoint في متغير الفصل @@url
داخل فئة gchart. في البداية اعتقدت أن أرقى متغير الفصل لتعيين عنوان URL إلى HTTPS
# Put this in an initializer
Gchart.send :class_variable_set, :@@url, "https://chart.apis.google.com/chart?"
Alas Google Charts لا يعمل عبر HTTPS. لذلك لا يمكننا استخدام هذه الطريقة. نظرا لأن طرق فئة Gchart فقط إرجاع عنوان URL، يمكننا التفاف المكالمات في طريقة وحدة تحكم وكيل تقوم بجانب خادم استدعاء API والوكالة عليه بالعميل عبر طريقة SEND_DATA الخاصة ب ActionController باستخدام بروتوكول الاختيار الخاص بك. بهذه الطريقة ليس لديك لإعادة اختراع عجلة مكتبة 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 Charts الآن SSL:
استعمالhttps://chart.googleapis.com/chart.
بدلا من :http://chart.apis.google.com/chart.
أنا أستخدم GRTRTB GMEM، وإصدار تعديل من الحل الأول يعمل بالنسبة لي أيضا. سيكون عليك استخدام طريقة To_escaped_url ل URI.Parse للتعامل معها بشكل صحيح.
لا أعرف من البرنامج المساعد الحالي الذي سيفعل هذا، لكن يمكنك القيام بذلك بمفردك. ما عليك سوى كتابة طريقة تحكم جديدة ستحصل على الرسم البياني عبر 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') %>
مجرد إعداد طريقك وأنت مجموعة كاملة.