我希望将部分内容作为降价片段。使用标准rails erb模板渲染它们的最简单方法是什么?
理想情况下,我想做这样的事情:
如果我在 app / views / _my_partial.md.erb 中有部分内容:
My awesome view
===============
Look, I can **use** <%= language %>!
我从这样的视图中引用:
<%= render "my_partial", :language => "Markdown!" %>
我希望得到如下输出:
<h1>My awesome view</h1>
<p>Look, I can <strong>use</strong> Markdown!</p>
答案 0 :(得分:79)
事实证明,正确的方法(tm)是使用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
如果require 'markdown_handler'
(或初始值设定项)中有config/application.rb
,那么任何视图或部分视图都可以使用扩展名.html.md
呈现为带有ERb插值的Markdown:
应用/视图/家/ index.html.md 强>:
My awesome view
===============
Look, I can **use** <%= @language %>!
应用/控制器/ home_controller.rb 强>:
class HomeController < ApplicationController
def index
@language = "Markdown"
end
end
答案 1 :(得分:20)
不是纯粹的降价解决方案,但您可以使用HAML filters呈现降价,以及其他标记语言。
例如,在app/views/_my_partial.html.haml
:
:markdown
My awesome view
===============
Look, I can **use** #{language}!
答案 2 :(得分:6)
我刚刚发布了一个markdown-rails gem,用于处理.html.md
个视图。
你不能用Erb链接它 - 它只适用于静态视图和局部视图。要嵌入Ruby代码,您必须使用:markdown
的tjwallace解决方案。
答案 3 :(得分:4)
在已经呈现的解决方案上,这是一种插值方式,在Rails 3中使用Haml的:markdown
过滤器和RDiscount gem在部分视图中呈现纯Markdown文件而不会有不必要的缩进。唯一的问题是你的Markdown文件是一个Haml文件,但这对像复制人这样的人来说无关紧要。
在 Gemfile :
中gem 'rdiscount'
在 app / views / my_page.html.haml
中:markdown
#{render 'my_partial', language: 'Markdown!'}
在 app / views / _my_partial.html.haml
中My awesome view
===============
Look, I can **use** #{language}!
如果你不需要传递给markdown文件的:language
变量,你可以完全取消你的Markdown是一个Haml文件:
在 app / views / my_page.html.haml
中:markdown
#{render 'my_partial.md'}
在 app / views / _my_partial.md
中My awesome view
===============
Sorry, cannot **use** #{language} here!
不喜欢Markdown文件中那些令人讨厌的下划线?
在 app / views / my_page.html.haml
中:markdown
#{render file: 'my_markdown.md'}
在 app / views / my_markdown.md
中My awesome view
===============
Sorry, cannot **use** #{language} here!
答案 4 :(得分:2)
利用your answer创建一个gem来为Rails中的GitHub Flavored Markdown呈现(通过HTML :: Pipeline):https://github.com/afeld/html_pipeline_rails
答案 5 :(得分:1)
这是一个类似于@ Jacob的版本,但是使用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
发布此lencioni的in this gist完全归功。
如果您想评估erb:
erb = ERB.new(template.source).result
@markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, options)
"#{@markdown.render(erb).inspect}.html_safe"
答案 6 :(得分:0)
您可以在Rails 5中使用嵌入式markdown。嵌入式markdown基于Jacob提供的解决方案above
将这两行添加到应用程序的Gemfile中:
宝石'redcarpet' 宝石'emd'
捆绑安装。
然后创建一个视图app/view/home/changelog.html.md
并将您的降价标记粘贴到该.md
文件中。
使用以下命令生成家庭控制器
rails generate controller home
在您的route.rb上添加以下行:
get '/changelog', :to 'home#changelog'
这就是全部。访问http://localhost:3000/changelog查看您呈现的降价