سؤال

أنا أستخدم 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') %>

مجرد إعداد طريقك وأنت مجموعة كاملة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top