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. И внутри шаблона мне нужен массив, с которым я могу выполнять итерацию, мне не нужна строка.

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


person Steph Thirion    schedule 25.10.2012    source источник


Ответы (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 или что-то в этом роде). Затем в ваших шаблонах вы можете сделать

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

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

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

person heliotrope    schedule 01.11.2012
comment
Отличный ответ, спасибо! Я заставил ваши фрагменты работать. Что меня беспокоит, так это то, что изменения в плагине не распространяются после перезагрузки (при использовании --auto). Любые идеи? - person Steph Thirion; 03.11.2012
comment
Итак, чтобы изменения в плагине зарегистрировались, вам нужно вручную перезапустить Jekyll? Боюсь, я вообще не знаю - я думаю, вам, возможно, придется перезапустить вручную во время разработки. Однако, если есть какие-то значения, которые вы будете регулярно (или когда-либо) настраивать, я бы посоветовал поместить их в config.yml, а затем получить к ним доступ оттуда в плагине. Вы можете получить доступ к конфигурации в виде хеша, например: 'config = Jekyll.configuration({})', а затем получить доступ к определенным параметрам, например 'config['some settings']' или 'config['some_parent']['some_nested_setting'. ]'. - person heliotrope; 04.11.2012