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

后端 未结 8 1685
小蘑菇
小蘑菇 2020-12-12 12:58

I want to have some of my partials as markdown snippets. What is the easiest way to render them using the standard rails erb templating?

Ideally, I\'d like to do so

相关标签:
8条回答
  • 2020-12-12 13:34

    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
    
    0 讨论(0)
  • 2020-12-12 13:35

    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

    0 讨论(0)
  • 2020-12-12 13:42

    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!
    
    0 讨论(0)
  • 2020-12-12 13:43

    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

    0 讨论(0)
  • 2020-12-12 13:43

    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"
    
    0 讨论(0)
  • 2020-12-12 13:46

    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

    0 讨论(0)
提交回复
热议问题