Ruby on rails 3 如何在Rails 3中使用标记自动渲染片段?

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 ===============

我想把我的一些片段作为降价片段。使用标准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
===============

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。允许我将所有标记内容放在一个文件夹中,并在需要时通过分区将其包括在内。无需拥有整个视图