How can I automatically render partials using markdown in Rails 3?

血红的双手。 提交于 2019-11-28 15:32:09

Turns out, the Right Way (tm) to do this is using 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

If you require 'markdown_handler' in your config/application.rb (or an initializer), then any view or partial can be rendered as Markdown with ERb interpolation using the extension .html.md:

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
tjwallace

Not a pure markdown solution but you can use HAML filters to render markdown, as well as other markup languages.

For example, in app/views/_my_partial.html.haml:

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

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

I just released a markdown-rails gem, which handles .html.md views.

You cannot chain it with Erb though -- it's only for static views and partials. To embed Ruby code, you'd have to use tjwallace's solution with :markdown.

Have found way not to use haml in such situation.

in views/layouts/_markdown.html.erb

<%= m yield %>

in app/helpers/application_helper.rb

def m(string)
   RDiscount.new(string).to_html.html_safe
end  

in Gemfile

gem 'rdiscount'

So, in view you can call it like:

<%= render :partial => "contract.markdown", :layout => 'layouts/markdown.html.erb' %>

And contract.markdown will be formatted as markdown

Piling on the solutions already presented, this is an interpolation-ary way in Rails 3 to render a pure Markdown file in a view from a partial without unnecessary indentation using Haml's :markdown filter and the RDiscount gem. The only catch is that your Markdown file is a Haml file, but that shouldn't matter for someone like a copy person.

In Gemfile:

gem 'rdiscount'

In app/views/my_page.html.haml

:markdown
  #{render 'my_partial', language: 'Markdown!'}

In app/views/_my_partial.html.haml

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

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

If you didn't need the :language variable passed in to the markdown file, you could do away altogether with your Markdown being a Haml file:

In app/views/my_page.html.haml

:markdown
  #{render 'my_partial.md'}

In app/views/_my_partial.md

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

Sorry, cannot **use** #{language} here!

Don't like those pesky underscores on your Markdown files?

In app/views/my_page.html.haml

:markdown
  #{render file: 'my_markdown.md'}

In app/views/my_markdown.md

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

Sorry, cannot **use** #{language} here!
Aidan Feldman

Leveraged your answer to make a gem to render for GitHub Flavored Markdown in Rails (via HTML::Pipeline): https://github.com/afeld/html_pipeline_rails

wpp

Here is a version similar to @Jacob's but using 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

Full credit to lencioni who posted this in this gist.

And if you'd like to evaluate erb:

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

You can use embedded Markdown in Rails 5. Embedded Markdown is based on the solution provided by Jacob above

  1. Add these to your application's Gemfile:
    gem 'coderay' #optional for Syntax Highlighting
    gem 'redcarpet'
    gem 'emd'
  1. bundle install.

  2. Then create a view app/view/home/changelog.html.md and paste your markdown in that .md file.

  3. Generate a home controller using the following command

    rails generate controller home

  4. Add the following line to your route.rb:

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

  5. That's all. Visit http://localhost:3000/changelog to see your rendered markdown

Source: http://github.com/ytbryan/emd

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!