Ruby 使用Middleman以降价方式呈现ERb模板的各个部分

Ruby 使用Middleman以降价方式呈现ERb模板的各个部分,ruby,markdown,erb,middleman,redcarpet,Ruby,Markdown,Erb,Middleman,Redcarpet,我第一次使用Middleman(以及Ruby和Rails),在使用Red地毯作为降价处理器渲染单个页面时遇到了一些障碍,而使用ERb作为布局 我想使用降价来设计单个内容块的样式,但每个页面将有多个内容块,并且样式独特 有没有一种方法可以在页面的多个区域实例化红毯渲染器而不是使用分区?所以在index.html.erb中,会有如下内容: <div class="grid5 container"> <% markdown do %> # Some markdo

我第一次使用Middleman(以及Ruby和Rails),在使用Red地毯作为降价处理器渲染单个页面时遇到了一些障碍,而使用ERb作为布局

我想使用降价来设计单个内容块的样式,但每个页面将有多个内容块,并且样式独特

有没有一种方法可以在页面的多个区域实例化红毯渲染器而不是使用分区?所以在
index.html.erb
中,会有如下内容:

<div class="grid5 container">
    <% markdown do %>
    # Some markdown
    <% end %>
</div>

<section class="grid6">
    <% markdown do %>
    ## More markdown
    <% end %>
</section>
根据上面链接的ASCICASTS,我的ERb模板使用与上面类似的代码:

<span class="g6 pre3">
<% markdown do %>
...etc...
<% end %>
但是我在加载页面时遇到一个错误:
ArgumentError at/about

参数数目错误(0代表1)

您定义了标记方法以接收一个名为
text
的参数。但您在视图中提供的是一个块

要使事情顺利进行,您可以更改在视图中调用
标记
帮助器方法的方式

<%= markdown 'this is some markdown text in here' %>
附言:自从Railscast发布以来,红毯语法有了一些变化,因此如果您使用的是更新的gem版本,那么以这种方式实现它将不起作用

至少从3.3.4(可能更早)开始,您必须创建一个特定的渲染器,然后使用标记作为参数对其调用render,即

def markdown
   Redcarpet::Render::XHTML.new.render(yield)
end

最新的文档可以在这里找到:

我也有同样的问题。上面说的没用。这是一个更简单的解决方案,没有自定义代码

我就是这么做的:

helpers do
  def markdown(&block)
    raise ArgumentError, "Missing block" unless block_given?
    content = capture_html(&block)
    concat Tilt['markdown'].new { content }.render
  end
end

它使用默认的中间人标记渲染。

我在这里找到了几种方法,但没有成功。最后,这是对我有效的解决方案:

def markdown(text)
  require 'redcarpet'
  require 'redcarpet/render_strip'
  markdown = Redcarpet::Markdown.new(Redcarpet::Render::StripDown)
  Markdown.new(text).to_html
end

在middleman中将
标记
字符串转换为html的助手

helpers do
    def markdown(content)
        Tilt['markdown'].new(context: @app) { content }.render
    end
end

设置
context:@app
参数以处理图像、与中间人助手的链接并避免异常。

我实际上不太理解您的问题?例如,为什么Railscast中构建的辅助对象在视图中不能多次工作?是的,为每个标记部分重新创建渲染器的性能不是很好,但它应该可以工作,对吗?或者你想知道如何使它更有效率?实际上,它根本不起作用,我也不太明白为什么。我会用我正在使用的代码和我得到的错误更新这个问题…好吧,让我们这样做,然后我们再看看@Lawitchka进行了更新,添加了更多关于代码本身的信息。“参数数量错误”错误专门指向写着
def markdown(text)
的行。我实际上也尝试了类似于后一个示例的内容,基于原始文档(和),但无法使其工作。上面的
def
导致了一个错误,所以我把它隐藏在一个助手后面。助手返回文本,但与纯文本一样--不进行标记解析。我到底做错了什么?我是不是从正确的角度来理解这一点?事实上,这是为了拉扯和分叉而创造的。对要点的描述应该有助于解释我试图实现的目标。我刚刚通过执行
减价。渲染(收益率)
从上述要点中发现Red地毯正在处理块;我只是不确定,现在,如何用已处理的块替换未处理的块。就像你在上面的问题中所做的那样。在视图中使用ERB标记,并在块中进行标记。记住使用带有等号的ERB标签,即。否则,该方法的结果将不会显示在您的视图中@_out_buf.concat((md do.to_s)^/path/to/about.html.erb:66:语法错误,意外关键字确保,预期')/path/to/about.html.erb:68:语法错误,意外关键字结束,预期'”
令人困惑,因为about.erb的第2行没有
,第68行也没有
关键字确保。
def markdown(text)
  require 'redcarpet'
  require 'redcarpet/render_strip'
  markdown = Redcarpet::Markdown.new(Redcarpet::Render::StripDown)
  Markdown.new(text).to_html
end
helpers do
    def markdown(content)
        Tilt['markdown'].new(context: @app) { content }.render
    end
end