Jekyll: как передать объект Ruby в шаблон?

например, скажем, я хотел бы создать этот массив:

random_numbers = []
1000.times { random_numbers << rand(2) }

и передайте его в шаблон, чтобы я мог получить доступ к нему из Liquid:

{% for num in random_numbers %} 
  ... here I'd use logic around the number to generate something.
{% endfor %}

примечание: Я хочу динамически генерировать массив в Ruby. И внутри шаблона мне нужен массив, с которым я могу перебирать, мне не нужна строка.

Как это можно сделать в Джекиле?

1 ответов


Ну, вам понадобится плагин:https://github.com/mojombo/jekyll/wiki/Plugins

Если бы Вы были рады поместить логику в свой плагин, вы могли бы сделать это в пользовательской Liquid::Tag, но ваши требования звучат так, как будто им нужен генератор, что нормально. Я просто бросил это вместе, и, кажется, работает так, как вы хотели бы:

module Jekyll

class RandomNumberGenerator < Generator

  def generate(site)
    site.pages.each do |page|
      a = Array.new
      1000.times { a << rand(2) }
      page.data['random_numbers'] = a
    end
  end

end

end

это должно идти в вашем каталоге _plugins/ (как rand.rb или что-то в этом роде). В своих шаблонах вы можете do

<ul>
    {% for number in page.random_numbers %}
        <li>{{ number }}</li>
    {% endfor %}
</ul>

или что угодно. Я предположил, что вам нужен другой набор чисел для каждой страницы, но если вы хотите один набор для всего сайта, вы можете легко создать массив один раз, а затем прикрепить его к объекту сайта или к каждой странице.

это не будет работать с автоматической генерацией на страницах Github (по понятным причинам они не разрешают пользовательские плагины), но это не должно быть проблемой-даже если вы используете страницы Github, есть много обходные приемы.