Подтвердить что ты не робот

Как я могу автоматически выполнять частичные операции с использованием уценки в Rails 3?

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

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

Если у меня есть частичное в приложении /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>
4b9b3361

Ответ 1

Оказывается, правильный способ (tm) для этого используется 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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

Найди способ не использовать haml в такой ситуации.

в views/layouts/_markdown.html.erb

<%= m yield %>

в приложении/помощниках/application_helper.rb

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

в Gemfile

gem 'rdiscount'

Итак, вы можете называть его так:

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

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

Ответ 5

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

В Gemfile:

gem 'rdiscount'

В приложении /views/my _page.html.haml

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

В приложении /views/ _my_partial.html.haml

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

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

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

В приложении /views/my _page.html.haml

:markdown
  #{render 'my_partial.md'}

В приложении /views/ _my_partial.md

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

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

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

В приложении /views/my _page.html.haml

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

В приложении /views/my _markdown.md

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

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

Ответ 7

Вот версия, похожая на @Jacob, но использующая 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"

Ответ 8

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

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

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

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

    rails generate controller home

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

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

  5. Все это. Зайдите на http://localhost: 3000/changelog, чтобы увидеть вашу уцененную уценку

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