Как я могу автоматически визуализировать партиалы, используя уценку в Rails 3? - PullRequest
36 голосов
/ 12 ноября 2010

Я хочу, чтобы некоторые из моих частичек были фрагментами уценки.Как проще всего сделать их с помощью стандартных шаблонов rails erb?

В идеале я хотел бы сделать что-то вроде этого:

Если у меня есть частичное в app / views / _my_partial.md.erb :

My awesome view
===============

Look, I can **use** <%= language %>!

, на который я ссылаюсь из вида следующим образом:

<%= render "my_partial", :language => "Markdown!" %>

Я хочу получить вывод, который выглядит следующим образом:

<h1>My awesome view</h1>
<p>Look, I can <strong>use</strong> Markdown!</p>

Ответы [ 8 ]

79 голосов
/ 13 апреля 2012

Оказывается, правильный путь (тм) для этого использует ActionView::Template.register_template_handler:

Библиотека / markdown_handler.rb

require 'rdiscount'

module MarkdownHandler
  def self.erb
    @erb ||= ActionView::Template.registered_template_handler(:erb)
  end

  def self.call(template)
    compiled_source = erb.call(template)
    "RDiscount.new(begin;#{compiled_source};end).to_html"
  end
end

ActionView::Template.register_template_handler :md, MarkdownHandler

Если вы require 'markdown_handler' в своем config/application.rb (или инициализаторе), то любое представление или частичное представление может быть отображено как Markdown с интерполяцией ERb с использованием расширения .html.md:

приложение / просмотров / дом / index.html.md

My awesome view
===============

Look, I can **use** <%= @language %>!

приложение / контроллеры / home_controller.rb

class HomeController < ApplicationController
  def index
    @language = "Markdown"
  end
end
20 голосов
/ 11 декабря 2010

Не просто решение для уценки, но вы можете использовать HAML-фильтры для визуализации уценки, а также других языков разметки.

Например, в app/views/_my_partial.html.haml:

:markdown
  My awesome view
  ===============

  Look, I can **use** #{language}!
6 голосов
/ 23 февраля 2012

Я только что выпустил markdown-rails gem, который обрабатывает .html.md представления.

Вы не можете связать его с Erb - это только для статических представлений и частичных представлений.Чтобы встроить код Ruby, вам нужно использовать решение tjwallace с :markdown.

4 голосов
/ 08 апреля 2012

Накапливаясь на уже представленных решениях, в Rails 3 это интерполяционный способ рендеринга чистого файла Markdown в виде из частичного без ненужного отступа с использованием фильтра :markdown Haml и гема RDiscount.Единственная загвоздка в том, что ваш файл Markdown является файлом Haml, но это не должно иметь значения для кого-то, например, копирующего.

In Gemfile :

gem 'rdiscount'

В app / views / my_page.html.haml

:markdown
  #{render 'my_partial', language: 'Markdown!'}

В app / views / _my_partial.html.haml

My awesome view
===============

Look, I can **use** #{language}!

Если вам не нужна переменная :language, передаваемая в файл уценки, вы можете полностью отказаться от использования Markdown в качестве файла Haml:

In app / views / my_page.html.haml

:markdown
  #{render 'my_partial.md'}

В app / views / _my_partial.md

My awesome view
===============

Sorry, cannot **use** #{language} here!

Не нравятся эти противные подчеркивания в ваших файлах Markdown?

В app / views / my_page.html.haml

:markdown
  #{render file: 'my_markdown.md'}

В app / views / my_markdown.md

My awesome view
===============

Sorry, cannot **use** #{language} here!
4 голосов
/ 06 ноября 2011

В такой ситуации нашли способ не использовать хамл.

в views / layouts / _markdown.html.erb

<%= m yield %>

в приложении/helpers/application_helper.rb

def m(string)
   RDiscount.new(string).to_html.html_safe
end  

in Gemfile

gem 'rdiscount'

Таким образом, вы можете назвать его следующим образом:

<%= render :partial => "contract.markdown", :layout => 'layouts/markdown.html.erb' %>

И contract.markdown будут отформатированы как уценка

2 голосов
/ 05 февраля 2014

Максимальное использование ваш ответ , чтобы создать гем для рендеринга для GitHub Flavoured Markdown в Rails (через HTML :: Pipeline): https://github.com/afeld/html_pipeline_rails

1 голос
/ 18 ноября 2015

Вот версия, похожая на @ Jacob's, но использующая Redcarpet .

module MarkdownHandler
  def self.erb
    @erb ||= ActionView::Template.registered_template_handler(:erb)
  end

  def self.call(template)
    options = {
      fenced_code_blocks:           true,
      smartypants:                  true,
      disable_indented_code_blocks: true,
      prettify:                     true,
      tables:                       true,
      with_toc_data:                true,
      no_intra_emphasis:            true
    }
    @markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, options)
    "#{@markdown.render(template.source).inspect}.html_safe"
  end
end
ActionView::Template.register_template_handler :md, MarkdownHandler

Полный кредит lencioni , который разместил это в этой сущности .

И , если вы хотите оценить erb:

erb = ERB.new(template.source).result
@markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, options)
"#{@markdown.render(erb).inspect}.html_safe"
0 голосов
/ 29 декабря 2016

Вы можете использовать встроенную Markdown в Rails 5. Встроенная Markdown основана на решении, предоставленном Jacob выше

  1. Добавьте их в Gemfile вашего приложения:
    gem 'coderay' #optional for Syntax Highlighting
    gem 'redcarpet'
    gem 'emd'

bundle install.

Затем создайте представление app/view/home/changelog.html.md и вставьте уценку в этот файл .md.

Сгенерируйте домашний контроллер, используя следующую команду

rails generate controller home

Добавьте следующую строку в ваш route.rb:

get '/changelog', :to 'home#changelog'

Вот и все.Посетите http://localhost:3000/changelog, чтобы увидеть уценку

Источник: http://github.com/ytbryan/emd

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...