如何在Rails 3中使用markdown自动渲染部分?

时间:2010-11-12 10:12:54

标签: ruby-on-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>

7 个答案:

答案 0 :(得分:79)

事实证明,正确的方法(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:

应用/视图/家/ index.html.md

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

Look, I can **use** <%= @language %>!

应用/控制器/ home_controller.rb

class HomeController < ApplicationController
  def index
    @language = "Markdown"
  end
end

答案 1 :(得分:20)

不是纯粹的降价解决方案,但您可以使用HAML filters呈现降价,以及其他标记语言。

例如,在app/views/_my_partial.html.haml

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

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

答案 2 :(得分:6)

我刚刚发布了一个markdown-rails gem,用于处理.html.md个视图。

你不能用Erb链接它 - 它只适用于静态视图和局部视图。要嵌入Ruby代码,您必须使用:markdown的tjwallace解决方案。

答案 3 :(得分:4)

在已经呈现的解决方案上,这是一种插值方式,在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}!

如果你不需要传递给markdown文件的:language变量,你可以完全取消你的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!

答案 4 :(得分:2)

利用your answer创建一个gem来为Rails中的GitHub Flavored Markdown呈现(通过HTML :: Pipeline):https://github.com/afeld/html_pipeline_rails

答案 5 :(得分:1)

这是一个类似于@ 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

发布此lencioniin this gist完全归功。

如果您想评估erb:

erb = ERB.new(template.source).result
@markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, options)
"#{@markdown.render(erb).inspect}.html_safe"

答案 6 :(得分:0)

您可以在Rails 5中使用嵌入式markdown。嵌入式markdown基于Jacob提供的解决方案above

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

    宝石'redcarpet' 宝石'emd'

  2. 捆绑安装。

  3. 然后创建一个视图app/view/home/changelog.html.md并将您的降价标记粘贴到该.md文件中。

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

    rails generate controller home

  5. 在您的route.rb上添加以下行:

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

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

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