我想将我的一些部分作为 Markdown 片段。使用标准 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>
事实证明,执行此操作的正确方法(tm)是使用
ActionView::Template.register_template_handler
:
lib/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
,则任何视图或部分都可以使用扩展名 .html.md
: 通过 ERb 插值呈现为 Markdown
app/views/home/index.html.md:
My awesome view
===============
Look, I can **use** <%= @language %>!
应用程序/控制器/home_controller.rb:
class HomeController < ApplicationController
def index
@language = "Markdown"
end
end
不是纯粹的 Markdown 解决方案,但您可以使用 HAML 过滤器 来渲染 Markdown 以及其他标记语言。
例如,在
app/views/_my_partial.html.haml
中:
:markdown
My awesome view
===============
Look, I can **use** #{language}!
已找到在这种情况下不使用 haml 的方法。
在 views/layouts/_markdown.html.erb
<%= m yield %>
在 app/helpers/application_helper.rb
def m(string)
RDiscount.new(string).to_html.html_safe
end
在 Gemfile
gem 'rdiscount'
所以,在 view 中你可以这样称呼它:
<%= render :partial => "contract.markdown", :layout => 'layouts/markdown.html.erb' %>
并且contract.markdown将被格式化为markdown
我刚刚发布了一个 markdown-rails gem,它可以处理
.html.md
视图。
但是你不能将它与 Erb 链接——它仅适用于静态视图和局部视图。要嵌入 Ruby 代码,您必须使用 tjwallace 的解决方案和
:markdown
。
在已经提出的解决方案的基础上,这是 Rails 3 中的一种插值方法,可以使用 Haml 的
:markdown
过滤器和 RDiscount gem 在部分视图中渲染纯 Markdown 文件,而无需不必要的缩进。唯一的问题是你的 Markdown 文件是 Haml 文件,但这对于像复制者这样的人来说应该不重要。
在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 文件中,则可以完全取消将 Markdown 作为 Haml 文件:
在 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!
利用你的答案制作一个 gem,以在 Rails 中呈现 GitHub Flavored Markdown(通过 HTML::Pipeline):https://github.com/afeld/html_pipeline_rails
这是一个类似于@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
并且如果您想评估 erb:
erb = ERB.new(template.source).result
@markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, options)
"#{@markdown.render(erb).inspect}.html_safe"
gem 'coderay' #optional for Syntax Highlighting
gem 'redcarpet'
gem 'emd'
bundle install
.
app/view/home/changelog.html.md
并将您的 Markdown 粘贴到该
.md
文件中。
rails generate controller home
get '/changelog', :to 'home#changelog'
http://localhost:3000/changelog 查看渲染的 markdown
"RDiscount.new(begin;#{ compiled_source };end).to_html"
"RDiscount.new(begin;#{ compiled_source }.to_s;end).to_html"
# frozen_string_literal: true
require 'rdiscount'
module MarkdownHandler
def self.erb
@erb ||= ActionView::Template.registered_template_handler(:erb)
end
def self.call(template, source)
compiled_source = erb.call(template, source)
"RDiscount.new(begin;#{ compiled_source }.to_s;end).to_html"
end
end
ActionView::Template.register_template_handler :md, MarkdownHandler