Rails4:如何在视图中使用markdown文件的内容?

Rails 4: how I use the contents of a markdown file in a view?

我有一个 Rails 4 应用程序,我想要一个 "changes" 页面来显示最近版本中引入的更改。我的项目目录根目录中的文件 CHANGELOG.md 中已经包含此信息。如果我可以有一个将 CHANGELOG.md 转换为 HTML.

changes.html.erb 视图,那将非常方便
-rw-r--r-- 1 ubuntu ubuntu 3640 Apr 24 22:50 CHANGELOG.md
-rw-r--r-- 1 ubuntu ubuntu 1180 Apr 30 13:58 Gemfile
-rw-r--r-- 1 ubuntu ubuntu 6324 Apr 30 13:58 Gemfile.lock
-rw-r--r-- 1 ubuntu ubuntu  155 Mar 10 14:47 README.md
-rw-r--r-- 1 ubuntu ubuntu  249 Mar 10 14:47 Rakefile
drwxr-xr-x 8 ubuntu ubuntu 4096 Mar 10 14:47 app/
drwxr-xr-x 2 ubuntu ubuntu 4096 Mar 10 14:47 bin/
drwxr-xr-x 5 ubuntu ubuntu 4096 Apr 24 22:50 config/
-rw-r--r-- 1 ubuntu ubuntu  153 Mar 10 14:47 config.ru
drwxr-xr-x 3 ubuntu ubuntu 4096 Mar 31 02:38 db/
drwxr-xr-x 4 ubuntu ubuntu 4096 Mar 10 14:47 lib/
drwxr-xr-x 2 ubuntu ubuntu 4096 Mar 14 13:53 log/
drwxr-xr-x 2 ubuntu ubuntu 4096 Mar 14 14:01 public/
drwxr-xr-x 2 ubuntu ubuntu 4096 Apr 26 22:44 spring/
drwxr-xr-x 8 ubuntu ubuntu 4096 Mar 29 02:58 test/
drwxr-xr-x 6 ubuntu ubuntu 4096 Mar 11 23:20 tmp/
drwxr-xr-x 3 ubuntu ubuntu 4096 Mar 10 14:47 vendor/

我能够关注 this example to create a helper method to convert Markdown to HTML using Redcarpet:

application_helper.rb

require 'redcarpet'

module ApplicationHelper
  # Convert markdown to HTML
  def markdown(text)
    options = {
      filter_html:     true,
      hard_wrap:       true, 
      link_attributes: { rel: 'nofollow', target: "_blank" },
      space_after_headers: true, 
      fenced_code_blocks: true
    }

    extensions = {
      autolink:           true,
      superscript:        true,
      disable_indented_code_blocks: true
    }

    renderer    = Redcarpet::Render::HTML.new(options)
    @markdown ||= Redcarpet::Markdown.new(renderer, extensions)
    @markdown.render(text).html_safe
  end    
end

然后我在我的静态页面控制器中创建了一个视图和操作 pages#changes

changes.html.erb

<h1 class="page-header">Recent Changes</h1>

<div class="row">
  <p>
    <%= markdown("We should be able to render `code` and **bold words** with [Markdown](https://daringfireball.net/projects/markdown)") %>
  </p>
</div>

这有效,但我不确定如何将 CHANGELOG.md 传递给 markdown 方法。如果我可以将 CHANGELOG.md 留在顶级目录中就好了,但我想我可以移动它,如果它允许我从视图中访问它的话。

您可以使用 File.read() 加载文件的内容。知道这一点,您只需要文件的路径:Rails.root/CHANGELOG.md

实现所需结果的一种方法是将以下代码放入页面的控制器中,然后在视图中呈现降价:

@changelog = File.read("#{Rails.root}/CHANGELOG.md")

然后只需在视图中使用 @changelogmarkdown 方法:

<%= markdown @changelog %>

您只需从磁盘读取文件即可。

Rails.root 给你一个 Pathname 对象,它指向 Rails 应用程序的根目录。

然后我们将文件路径传递给 IO.read,它读取文件内容并在完成后关闭文件处理程序。

<div class="row">
  <p>
    <%= markdown(IO.read(Rails.root.join('CHANGELOG.md')) ) %>
  </p>
</div>

但是您可能希望 use low level caching 仅在文件更改时才进行转换,而不是在每次请求时都进行!

module ApplicationHelper

  # ...

  def file_to_markdown(file)
    cache_key = [file, File.mtime(file)].join('-')
    Rails.cache.fetch(cache_key) do
      self.markdown(IO.read(file))
    end
  end  
end

你可以这样称呼它:

file_to_markdown(Rails.root.join("CHANGELOG.md"))

只需将 kramdown-rails gem 添加到您的 Gemfile,然后在您的视图目录中创建 .md 文件,它就会自动运行。 None 需要上述努力。

您可以在 rails 5+ 和 gem emd

上使用嵌入式降价

将这两行添加到应用程序的 Gemfile 中:

gem 'redcarpet'
gem 'emd'

bundle install.

然后创建一个视图 home/changelog.html.md 并将您的标记粘贴到该文件中。

At your route.rb, add this line:

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

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

注意:您将需要一个名为 home 的控制器。 rails generate controller home

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