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

Jac*_*cob 36 markdown partials ruby-on-rails-3

我希望将我的部分内容作为降价片段.使用标准rails erb模板渲染它们的最简单方法是什么?

理想情况下,我想做这样的事情:

如果我在app/views/_my_partial.md.erb中有部分内容:

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

Look, I can **use** <%= language %>!
Run Code Online (Sandbox Code Playgroud)

我从这样的观点中引用:

<%= render "my_partial", :language => "Markdown!" %>
Run Code Online (Sandbox Code Playgroud)

我想获得如下所示的输出:

<h1>My awesome view</h1>
<p>Look, I can <strong>use</strong> Markdown!</p>
Run Code Online (Sandbox Code Playgroud)

Jac*_*cob 80

事实证明,正确的方法(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
Run Code Online (Sandbox Code Playgroud)

如果你require 'markdown_handler'在你的config/application.rb(或初始化),那么任何视图或部分可呈现为降价与使用扩展ERb的插值.html.md:

app/views/home/index.html.md:

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

Look, I can **use** <%= @language %>!
Run Code Online (Sandbox Code Playgroud)

app/controllers/home_controller.rb:

class HomeController < ApplicationController
  def index
    @language = "Markdown"
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 尼斯.让我补充一点,别忘了将```gem'rdiscount'```添加到你的gemfile中,你可以将处理程序放在init目录中,它只会被加载.```config/initializers/markdown_handler.rb```这意味着你可以跳到```config/applicaiton.rb``` (12认同)
  • 如果有人对使用红地毯感兴趣,唯一需要更改的行是"Redcarpet :: Markdown.new(Redcarpet :: Render :: HTML,no_intra_emphasis:true,autolink:true).render(begin;#{compiled_source};端).html_safe"` (9认同)
  • 有趣的是,我怀疑通过在生成的源中添加.html_safe可以减轻这种情况.从'erb.call(template)`返回的代码已经被渲染的ERb转义,我们在这里没有进行任何插值,所以应该没问题. (2认同)
  • 这个答案实际上被低估了:即使是3个宝石*有点*做同样的事情[maildown](https://github.com/schneems/maildown),[markdown-rails](https://github.com/joliss/ markdown-rails),[markerb](https://github.com/plataformatec/markerb)没有达到如此出色的效果.我估计它应该在rails中. (2认同)
  • 请注意任何发现此线程并尝试使其与 Rails 6.0 一起工作的人:“ActionView::Template.registered_template_handler”发生了更改,它现在需要两个参数“template”和“source”(而不是只是模板)。我正在想办法解决这个问题,如果我弄清楚了,将回答这个问题[在这个问题下](/sf/ask/3970060671/红地毯) (2认同)

tjw*_*ace 20

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

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

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

  Look, I can **use** #{language}!
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢这种方法是它强制缩进应该可以说是纯粹的降价文件.如果我希望复制人能够控制某些内容,我希望他们拥有整个文件,而不必记住将所有内容缩进一级. (5认同)

Jo *_*iss 6

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

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