我如何在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 :markdownfilter和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文件的:languagevariables,那么你可以把你的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

  1. 将这两行添加到应用程序的Gemfile中:

    gem'redcarpet'gem'emd'

  2. 捆绑安装。

  3. 然后创build一个视图app/view/home/changelog.html.md并将该markdown粘贴到.md文件中。

  4. 使用以下命令生成一个家庭控制器

    rails generate controller home

  5. 在你的route.rb,添加这一行:

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

  6. 就这样。 访问http:// localhost:3000 / changelog查看您的呈现降价

来源: http : //github.com/ytbryan/emd