38

我想将我的一些部分作为降价片段。使用标准 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>
4

8 回答 8

83

事实证明,这样做的正确方法(tm)是使用ActionView::Template.register_template_handler

库/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(或初始化程序)中,则任何视图或部分视图都可以使用扩展名通过 ERb 插值呈现为 Markdown .html.md

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
于 2012-04-12T20:28:09.297 回答
20

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

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

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

  Look, I can **use** #{language}!
于 2010-12-11T19:02:29.317 回答
4

已经找到在这种情况下不使用haml的方法。

视图/布局/_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将被格式化为markdown

于 2011-11-06T12:18:00.633 回答
4

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

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

于 2012-02-23T12:09:07.253 回答
4

:markdown在已经提出的解决方案的基础上,这是 Rails 3 中的一种插值方法,可以使用 Haml 的过滤器和 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!
于 2012-04-08T09:29:20.587 回答
2

利用您的答案为 Rails 中的 GitHub Flavored Markdown 渲染一个 gem(通过 HTML::Pipeline):https ://github.com/afeld/html_pipeline_rails

于 2014-02-05T15:34:41.350 回答
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

完全归功于在此要点中发布此内容的lencioni

如果您想评估 erb:

erb = ERB.new(template.source).result
@markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, options)
"#{@markdown.render(erb).inspect}.html_safe"
于 2015-11-18T11:12:26.850 回答
0

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

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

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

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

    rails generate controller home

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

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

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

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

于 2016-12-29T13:08:41.097 回答