我有一个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
留在顶级目录中会很好,但我想我可以移动它,如果它允许我从视图中访问它。
答案 0 :(得分:4)
您可以使用File.read()
加载文件的内容。知道了这一点,您只需要文件的路径:Rails.root
/ CHANGELOG.md
实现所需结果的一种方法是将以下代码放在页面控制器中,然后在视图中显示降价:
@changelog = File.read("#{Rails.root}/CHANGELOG.md")
然后在视图中使用@changelog
方法{/ 1}}:
markdown
答案 1 :(得分:2)
您可以在带有gem emd
将这两行添加到应用程序的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
答案 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"))