むろっちのStacking

日々の中で学んだIT知識をメモして置く場所

Railsで簡単にMarkdownを使えるようにする

たまにRailsアプリだけど、静的ページだから手間をかけずにメンテしたいとか、 Railsわからない人にもメンテしてほしいページとかがあります そんなときにはMarkdown形式でページが作成されていると便利です

今回はRubyMarkdown用Gem「redcarpet」を利用したRailsアプリでのMarkdown記法利用方法について説明します

今回試した環境

ディレクトリ構成

  • top:今回のviewに対応するコントローラー。top#index => rootとなるように設定

方法

  • redcarpet gemを追加する

  • application_helperにredcarpetを利用するメソッドを作成する
# helpers/application_helper.rb
module ApplicationHelper
  # markdown形式のファイルをhtmlに変換
  # 例ファイル名:"index.md" controller:Top
  # = "#{APP_ROOT}/app/views/top/index.md"
  #
  def render_md(md_path)
    #ファイル名のみ:controller名フォルダ配下を参照
    #ディレクトリ+ファイル名:Viewsルートからのパスを参照
    if File.basename(md_path) == md_path
      path = "#{File.expand_path(Dir::getwd)}/app/views/#{controller.controller_name}/#{md_path}"
    else
      path = "#{File.expand_path(Dir::getwd)}/app/views/#{md_path}"
    end

    return nil unless File.extname(path) == ".md"

    text = File.open(path,"r") do |f|
            f.read
           end
           
    # redcarpetのオプション類
    options = {
      filter_html:     true,
      hard_wrap:       true,
      space_after_headers: true,
    }

    extensions = {
      autolink:           true,
      no_intra_emphasis:  true,
      fenced_code_blocks: true,
    }

    renderer = Redcarpet::Render::HTML.new(options)
    markdown = Redcarpet::Markdown.new(renderer, extensions)

    markdown.render(text).html_safe
  end
end
  • controllerのerbテンプレートにMarkdown用のrenderを記載する
#views/top/index.html.erb
<%= render_md "index.md" %>
<%= render_md "shared/shared.md" %>

できあがり