1

我编写了一个 Jekyll 插件,通过使用 garb gem 调用 Google Analytics API 来显示页面上的浏览量。我的方法唯一的问题是它会为每个页面调用 API,从而减慢构建时间,并且可能会达到 API 的用户调用限制。

可以在一次调用中返回所有数据并将其存储在本地,然后查找每个页面的综合浏览量,但我的 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

我的插件的完整版在这里

如何将所有对 API 的调用移动到其他函数并确保 jekyll 在开始时运行一次,然后调整上面的标签以读取该本地数据?

编辑看起来这可以通过生成器完成并将数据写入文件。请参阅此分支上的示例现在我只需要弄清楚如何对结果进行子集化:https ://github.com/Sija/garb/issues/22

4

1 回答 1

0

要存储数据,我必须:

  1. 编写一个生成器类(参见Jekyll wiki 插件)来调用 API。

  2. 将数据转换为散列(为了便于按路径查找,请参见 5):

    result = Hash[data.collect{|row| [row.page_path, [row.exits, row.pageviews]]}]
    
  3. 将数据哈希写入 JSON 文件。

  4. 从我现有的 Liquid 块类中的文件中读取数据。

    请注意,块标签从_includes目录工作,而生成器从根目录工作。

  5. 匹配页面路径,将数据转换为哈希后很容易:

    result[path][1]
    

完整插件的代码,显示如何创建生成器和写入文件等,here

感谢GitHub 上的Sija提供的帮助。

于 2013-03-07T18:13:09.553 回答