我如何在Rails 3中使用markdown自动渲染partials?
我想有一些我的部分作为降价片段。 使用标准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
如果在config/application.rb
(或初始化程序)中require 'markdown_handler'
,则可以使用扩展名.html.md
将任何视图或部分渲染为带有ERb插值的Markdown:
app / views / home / index.html.md :
My awesome view =============== Look, I can **use** <%= @language %>!
app / controllers / home_controller.rb :
class HomeController < ApplicationController def index @language = "Markdown" end end
不是一个纯粹的降价解决scheme,但您可以使用HAMLfilter来呈现降价,以及其他标记语言。
例如,在app/views/_my_partial.html.haml
:
:markdown My awesome view =============== Look, I can **use** #{language}!
我刚刚发布了一个处理.html.md
视图的markdown-rails gem。
你不能用Erb链接它 – 只能用于静态视图和局部视图。 要embeddedRuby代码,您必须使用tjwallace的解决scheme:markdown
。
在这种情况下已经find了不使用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'
所以,鉴于你可以这样称呼它:
<%= render :partial => "contract.markdown", :layout => 'layouts/markdown.html.erb' %>
而contract.markdown将被格式化为降价
在已经提出的解决scheme上打桩,这是Rails 3中的一种内插方法,可以在部分视图中呈现纯Markdown文件,而不需要使用Haml's :markdown
filter和RDiscount gem进行不必要的缩进。 唯一的问题是你的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}!
如果你不需要传递给markdown文件的:language
variables,那么你可以把你的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呈现GitHub Flavored Markdown在Rails(通过HTML ::pipe道): https : //github.com/afeld/html_pipeline_rails
这是一个类似于@雅各布的版本,但是使用了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(RedcarpetHeaderFix, 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(RedcarpetHeaderFix, options) "#{@markdown.render(erb).inspect}.html_safe"
您可以在Rails 5中使用embedded式markdown。embedded式markdown是基于Jacob提供的解决scheme
-
将这两行添加到应用程序的Gemfile中:
gem'redcarpet'gem'emd'
-
捆绑安装。
-
然后创build一个视图
app/view/home/changelog.html.md
并将该markdown粘贴到.md
文件中。 -
使用以下命令生成一个家庭控制器
rails generate controller home
-
在你的route.rb,添加这一行:
get '/changelog', :to 'home#changelog'
-
就这样。 访问http:// localhost:3000 / changelog查看您的呈现降价
来源: http : //github.com/ytbryan/emd