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

时间:2016-04-30 16:01:56

标签: ruby-on-rails markdown

我有一个Rails 4应用程序,我希望有一个"更改"显示最新版本中引入的更改的页面。我已经在项目目录的根目录中的文件CHANGELOG.md中包含此信息。如果我有changes.html.erb视图可以将CHANGELOG.md转换为HTML,那将非常方便。

-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创建一个帮助方法,使用Redcarpet将Markdown转换为HTML:

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留在顶级目录中会很好,但我想我可以移动它,如果它允许我从视图中访问它。

4 个答案:

答案 0 :(得分:4)

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

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

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

然后在视图中使用@changelog方法{/ 1}}:

markdown

答案 1 :(得分:2)

您可以在带有gem emd

的rails 5+上使用嵌入式markdown

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

gem 'redcarpet'
gem 'emd'
  

捆绑安装。

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

  

在您的route.rb上添加以下行:

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

  

这就是全部。访问http://localhost:3000/changelog查看您呈现的降价

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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"))