Ruby on rails 3 如何在Rails 3中使用标记自动渲染片段?
我想把我的一些片段作为降价片段。使用标准rails erb模板渲染它们的最简单方法是什么 理想情况下,我想做这样的事情:Ruby on rails 3 如何在Rails 3中使用标记自动渲染片段?,ruby-on-rails-3,markdown,partials,Ruby On Rails 3,Markdown,Partials,我想把我的一些片段作为降价片段。使用标准rails erb模板渲染它们的最简单方法是什么 理想情况下,我想做这样的事情: <h1>My awesome view</h1> <p>Look, I can <strong>use</strong> Markdown!</p> 如果我在app/views/\u my\u partial.md.erb中有一个分部: My awesome view ===============
<h1>My awesome view</h1>
<p>Look, I can <strong>use</strong> Markdown!</p>
如果我在app/views/\u my\u partial.md.erb中有一个分部:
My awesome view
===============
Look, I can **use** <%= language %>!
gem 'rdiscount'
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
My awesome view
===============
Look, I can **use** <%= @language %>!
class HomeController < ApplicationController
def index
@language = "Markdown"
end
end
我的绝妙视角
===============
看,我可以**使用**!
我从这样的角度来看:
<%= render "my_partial", :language => "Markdown!" %>
“降价!”%%>
我希望得到如下输出:
<h1>My awesome view</h1>
<p>Look, I can <strong>use</strong> Markdown!</p>
我的绝妙视角
看,我能用减价
不是一个纯粹的标记解决方案,但您可以使用它来呈现标记,以及其他标记语言
例如,在app/views/_my_partial.html.haml
中:
:markdown
My awesome view
===============
Look, I can **use** #{language}!
已经找到了在这种情况下不使用haml的方法 在视图/layouts/_markdown.html.erb中
<%= m yield %>
def m(string)
RDiscount.new(string).to_html.html_safe
end
在Gemfile中
gem 'rdiscount'
因此,在视图中,您可以这样称呼它:
<%= render :partial => "contract.markdown", :layout => 'layouts/markdown.html.erb' %>
“contract.markdown”,:layout=>'layouts/markdown.html.erb'>
和合同。降价将被格式化为降价我刚刚发布了一个gem,它处理.html.md
视图
但是,您不能将它与Erb链接起来——它只用于静态视图和部分视图。要嵌入Ruby代码,您必须使用tjwallace的解决方案,并在已经提供的解决方案的基础上添加
:markdown,这是Rails 3中的一种插值方法,使用Haml的:markdown
过滤器和RDiscount gem从局部视图中呈现纯标记文件,而不需要进行不必要的缩进。唯一需要注意的是,您的降价文件是一个Haml文件,但对于像复制人这样的人来说,这并不重要
在文件中:
My awesome view
===============
Look, I can **use** <%= language %>!
gem 'rdiscount'
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
My awesome view
===============
Look, I can **use** <%= @language %>!
class HomeController < ApplicationController
def index
@language = "Markdown"
end
end
在app/views/my_page.html.haml中
:markdown
#{render 'my_partial', language: 'Markdown!'}
My awesome view
===============
Look, I can **use** #{language}!
:markdown
#{render 'my_partial.md'}
:markdown
#{render file: 'my_markdown.md'}
在app/views/_my_partial.html.haml中
:markdown
#{render 'my_partial', language: 'Markdown!'}
My awesome view
===============
Look, I can **use** #{language}!
:markdown
#{render 'my_partial.md'}
:markdown
#{render file: 'my_markdown.md'}
如果不需要传递到标记文件中的:language
变量,则可以完全取消标记为Haml文件:
在app/views/my_page.html.haml中
:markdown
#{render 'my_partial', language: 'Markdown!'}
My awesome view
===============
Look, I can **use** #{language}!
:markdown
#{render 'my_partial.md'}
:markdown
#{render file: 'my_markdown.md'}
在app/views/_my_partial.md中
My awesome view
===============
Sorry, cannot **use** #{language} here!
My awesome view
===============
Sorry, cannot **use** #{language} here!
不喜欢你降价文件上那些讨厌的下划线吗
在app/views/my_page.html.haml中
:markdown
#{render 'my_partial', language: 'Markdown!'}
My awesome view
===============
Look, I can **use** #{language}!
:markdown
#{render 'my_partial.md'}
:markdown
#{render file: 'my_markdown.md'}
在app/views/my_markdown.md中
My awesome view
===============
Sorry, cannot **use** #{language} here!
My awesome view
===============
Sorry, cannot **use** #{language} here!
事实证明,正确的方法(tm)是使用ActionView::Template.register\u Template\u handler
:
lib/markdown\u handler.rb:
My awesome view
===============
Look, I can **use** <%= language %>!
gem 'rdiscount'
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
My awesome view
===============
Look, I can **use** <%= @language %>!
class HomeController < ApplicationController
def index
@language = "Markdown"
end
end
如果在配置/application.rb
(或初始值设定项)中需要“markdown\u handler”
,则可以使用扩展名.html.md
将任何视图或部分视图渲染为带有ERb插值的markdown:
app/views/home/index.html.md:
My awesome view
===============
Look, I can **use** <%= language %>!
gem 'rdiscount'
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
My awesome view
===============
Look, I can **use** <%= @language %>!
class HomeController < ApplicationController
def index
@language = "Markdown"
end
end
我的绝妙视角
===============
看,我可以**使用**!
app/controllers/home\u controller.rb:
My awesome view
===============
Look, I can **use** <%= language %>!
gem 'rdiscount'
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
My awesome view
===============
Look, I can **use** <%= @language %>!
class HomeController < ApplicationController
def index
@language = "Markdown"
end
end
class HomeController
利用它在Rails中为GitHub风格的降价制作一个gem来渲染(通过HTML::Pipeline):这里有一个类似于@Jacob的版本,但使用了
完全归功于发布此消息的人
和如果您想评估雇员再培训局:
erb = ERB.new(template.source).result
@markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, options)
"#{@markdown.render(erb).inspect}.html_safe"
您可以在Rails 5中使用嵌入式标记。嵌入式降价基于Jacob提供的解决方案
将以下内容添加到应用程序的GEM文件:
捆绑安装
然后创建一个视图app/view/home/changelog.html.md
并将您的标记粘贴到该.md
文件中
使用以下命令生成主控制器
rails生成控制器主页
将以下行添加到route.rb:
get'/changelog',:到'home#changelog'
就这些。访问以查看渲染的降价
来源:我不喜欢这种方法,因为它会强制缩进一个可以说是纯降价文件的文件。如果我想让复制人能够控制某些内容,我希望他们拥有整个文件,而不必记住将所有内容缩进一级。但好的是,它不会两次加载相同的功能,对吗?gem'rdisont'
在那里还需要吗?也许这个答案是一个很好的折衷方案?美好的让我补充一下,不要忘记将gem'rdisont'
添加到您的gem文件中,您可以将处理程序放在init目录中,它将一直被加载config/initializers/markdown\u handler.rb
这意味着您可以跳过对config/applicationon.rb的更改。有趣的是,我怀疑在生成的源代码中添加.html\u safe可以缓解这一问题。从erb.call(template)
返回的代码已经由erb呈现转义,我们这里不做任何插值,所以应该可以。如果有人对使用红地毯感兴趣,唯一要更改的行是“red地毯::Markdown.new(red地毯::Render::HTML,no_intra\u emphasis:true,autolink:true)。呈现(开始#{compiled_source};end).html_safe“
这个答案实际上被低估了:即使3个gem做了同样的事情,也没有取得如此好的效果。我认为默认情况下,它应该在rails中。对于任何发现此线程并试图使其与rails 6.0配合使用的人,我只是提醒一下:对ActionView::Template.registered\u Template\u handler进行了更改ow需要两个参数,template
和source
(而不仅仅是template)。我正在想办法解决它,如果我找到了,就会回答这个问题哈哈,讨厌。我喜欢这个。谢谢,这个gem是我的完美解决方案(实际上是Rails 4)。此gem非常适合Rails 4。允许我将所有标记内容放在一个文件夹中,并在需要时通过分区将其包括在内。无需拥有整个视图