Как я могу автоматически выполнять частичные операции с использованием уценки в 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>
Ответы
Ответ 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!
Ответ 6
Укомплектованный ваш ответ, чтобы сделать драгоценный камень для рендеринга для GitHub Flavored Markdown in Rails (через HTML:: Pipeline): https://github.com/afeld/html_pipeline_rails
Ответ 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 выше.
- Добавьте их в свое приложение 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