2013-03-05 3 views
1

Я написал плагин Jekyll, чтобы отображать количество просмотров страниц на странице, вызывая API Google Analytics, используя драгоценный камень garb. Единственная проблема с моим подходом заключается в том, что он делает вызов API для каждой страницы, замедляя время сборки, а также потенциально ударяя пределы пользовательских вызовов API.Избегайте повторных вызовов API в Jekyll Ruby plugin

Можно было бы вернуть все данные за один вызов и сохранить их локально, а затем просмотреть количество просмотров страницы с каждой страницы, но мой Jekyll/Ruby-fu не до нуля. Я не знаю, как написать плагин для запуска один раз, чтобы получить все данные и сохранить их локально, где моя текущая функция может затем получить к нему доступ, а не вызывать API за страницей.

В основном мой код записывается в виде жидкого блока, который может быть введен в мой макет страницы:

class GoogleAnalytics < Liquid::Block 
    def initialize(tag_name, markup, tokens) 
     super # options that appear in block (between tag and endtag) 
     @options = markup # optional optionss passed in by opening tag 
    end 
    def render(context) 
     path = super 
     # Read in credentials and authenticate 
     cred = YAML.load_file("/home/cboettig/.garb_auth.yaml") 
     Garb::Session.api_key = cred[:api_key] 
     token = Garb::Session.login(cred[:username], cred[:password]) 
     profile = Garb::Management::Profile.all.detect {|p| p.web_property_id == cred[:ua]} 

     # place query, customize to modify results 
     data = Exits.results(profile, 
          :filters => {:page_path.eql => path}, 
          :start_date => Chronic.parse("2011-01-01")) 

     data.first.pageviews 
    end 

Full version of my plugin is here

Как я могу переместить все вызовы к API для некоторой другой функции и сделать Конечно, jekyll запускает это один раз в начале, а затем корректирует тег выше, чтобы прочитать эти локальные данные?

EDIT Похоже, что это можно сделать с помощью генератора и записать данные в файл. Смотрите пример на this branch Теперь мне просто нужно, чтобы выяснить, как подмножество результатов: https://github.com/Sija/garb/issues/22

+0

Зачем ссылаться на Google? Храните свои страницы на локальном уровне. В любом случае, они будут более точными. – NotMe

+0

Боюсь, вам придется уточнить. Я использую Google Analytics для записи просмотров страниц в первую очередь. Как еще я мог бы это сделать (что не было бы функционально эквивалентным?) Любой метод должен был бы получить текущее количество просмотров страниц при запуске Jekyll, а затем добавить его на каждую страницу, чтобы проблема осталась прежней. – cboettig

+0

На самом деле проблема другая. Проблема заключается в том, что вы тянете с Google на каждую загрузку страницы. Просто сохраняя их локально, вы выполняете две вещи.Во-первых, у вас будут несколько более точные данные; но что более важно, если вы все еще запрашиваете каждую загрузку страницы, то это не имеет большого значения. Как бы то ни было, если вы объедините два: только запустите google при запуске, но сохраните локальный кеш, вы увидите, что ваши номера немного расходятся. – NotMe

ответ

0

Для хранения данных, я должен был:

  1. Написать класс генератора (см Jekyll wiki plugins) для вызова API ,

  2. Преобразование данных в хэш (для удобного поиска по пути, см 5):

    result = Hash[data.collect{|row| [row.page_path, [row.exits, row.pageviews]]}] 
    
  3. Написать хэш данных в файл JSON.

  4. Читайте данные из файла в моем существующем классе жидких блоков.

    Обратите внимание, что тег блока работает из каталога _includes, а генератор работает из корневого каталога.

  5. Match путь страницы, просто когда данные преобразуются в хеш:

    result[path][1] 
    

Code for the full plugin, showing how to create the generator and write files, etc, here

А благодаря Sija на GitHub помощь по этому вопросу.

+0

Ваша проблема, похоже, связана с проблемой, которую я сейчас имею (см. [Этот комментарий] (https://gist.github.com/yeban/2290195#comment-966668)). Вы знаете, как это исправить? –

Смежные вопросы