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

问题描述 投票:0回答:9

我想将我的一些部分作为 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>
ruby-on-rails-3 markdown partials
9个回答
85
投票

事实证明,执行此操作的正确方法(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

20
投票

不是纯粹的 Markdown 解决方案,但您可以使用 HAML 过滤器 来渲染 Markdown 以及其他标记语言。

例如,在

app/views/_my_partial.html.haml
中:

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

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

4
投票

已找到在这种情况下不使用 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


4
投票

我刚刚发布了一个 markdown-rails gem,它可以处理

.html.md
视图。

但是你不能将它与 Erb 链接——它仅适用于静态视图和局部视图。要嵌入 Ruby 代码,您必须使用 tjwallace 的解决方案和

:markdown


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}!

如果您不需要将

: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!

2
投票

利用你的答案制作一个 gem,以在 Rails 中呈现 GitHub Flavored Markdown(通过 HTML::Pipeline):https://github.com/afeld/html_pipeline_rails


2
投票

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

0
投票
您可以在Rails 5中使用嵌入式Markdown。嵌入式Markdown是基于Jacob提供的解决方案

上面

    将这些添加到应用程序的 Gemfile 中:
gem 'coderay' #optional for Syntax Highlighting gem 'redcarpet' gem 'emd'

  1. bundle install

    .

  2. 然后创建一个视图

    app/view/home/changelog.html.md

     并将您的 Markdown 粘贴到该 
    .md
     文件中。

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

    rails generate controller home

    
    

  4. 将以下行添加到您的route.rb:

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

    
    

  5. 仅此而已。访问

    http://localhost:3000/changelog 查看渲染的 markdown

来源:

http://github.com/ytbryan/emd


0
投票
Rails 7.1更新需要额外的“.to_s”来满足OutputBuffer:

"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
    
© www.soinside.com 2019 - 2024. All rights reserved.