Использование ERB в уценке с Redcarpet - PullRequest
1 голос
/ 22 июня 2019

Я пытаюсь заставить Markdown хорошо играть с .erb. Я хотел бы использовать high_voltage для рендеринга страниц уценки (или обычных файлов .html.erb с частями уценки), которые анализируются с Redcarpet, и я пытаюсь заставить его работать вместе.

На данный момент у меня есть инициализатор с именем markdown_template_handler.rb, который содержит следующий код:

class MarkdownTemplateHandler
  def erb
    @erb ||= ActionView::Template.registered_template_handler(:erb)
  end

  def call(template)
    compiled_source = erb.call(template)
    markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)

    "#{markdown.render(compiled_source.source).inspect}.html_safe;"
  end
end

ActionView::Template.register_template_handler(:md, MarkdownTemplateHandler.new)

Однако в строке 7 происходит сбой, compiled_source = erb.call(template) с кодом ошибки «неправильное количество аргументов (задано 1, ожидается 2)» *

Я посмотрел документацию ERB Ruby , но из того, что я понял, метод вызова является производным от нового метода, для которого требуется только 1 аргумент - текст. Тем не менее, когда я попытался использовать его только в сеансе консоли быстрого рельсы, это также потребовало двух аргументов.

Когда я удаляю требование разбирать erb из приведенного выше кода, все работает как положено, поэтому я не думаю, что это имеет какое-либо отношение к неработающему Redcarpet.

Я использую Rails v6.0.0.rc1 и Ruby v2.5.3p105

Любая помощь приветствуется.

Редактировать

Дальнейшие исследования привели меня к поиску обработчика шаблона ERB ActionView Rails 6.0. Метод вызова этого обработчика действительно требует двух аргументов, шаблона и источника. Тем не менее, в Rails 5.2.3 для вызова метода обработчика шаблона ERB Action View требуется только один аргумент - шаблон.

Может ли кто-нибудь указать мне, как выяснить, что источник в этом контексте? Для него нет документации, которую я могу найти.


1 Ответ

0 голосов
/ 26 июня 2019

В этом случае источник будет передан в call ActionView при вызове обработчика.

Вы бы переписали свою функцию call так:

def call(template, source)
  compiled_source = erb.call(template, source)
  markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)

  "#{markdown.render(compiled_source).inspect}.html_safe;"
end

До Rails 6 значение source было извлечено из template.source, но теперь оно передается как отдельный параметр.

...