我第一次使用Middleman(以及Ruby和Rails),在使用Redcarpet作为我的降价处理器和ERb进行布局渲染单个页面时,我遇到了一些障碍。 / p>
我想使用Markdown来设置单个内容块的样式,但每个页面都有多个内容,风格独特。
有没有办法在页面的多个区域实例化Redcarpet渲染器,而不是使用partials?所以在index.html.erb
中,会出现这样的情况:
<div class="grid5 container">
<% markdown do %>
# Some markdown
<% end %>
</div>
<section class="grid6">
<% markdown do %>
## More markdown
<% end %>
</section>
我已经尝试构建helper based on several tutorials,但我在Rails方面还不是很好。
修改 我的config.rb帮助器看起来像:
module MD
def markdown(text)
Redcarpet.new(text).to_html
end
end
helpers MD
上面链接的每个ASCIIcast,我的ERb模板使用与上面相似的代码:
<span class="g6 pre3">
<% markdown do %>
...etc...
<% end %>
但是我在加载页面时遇到错误:ArgumentError at /about
wrong number of arguments (0 for 1)
答案 0 :(得分:4)
您定义了降价方法以接收一个名为text
的参数。但是你在视图中提供的是一个块。
要使工作正常,您可以更改在视图中调用markdown
辅助方法的方式
<%= markdown 'this is some markdown text in here' %>
或者您更改降价助手以接受块
def markdown
Redcarpet.new(yield).to_html
end
P.S。:自Railscast之后,Redcarpet语法发生了一些变化,所以如果你使用的是更新的gem版本,那么以这种方式实现它将不起作用。
至少从3.3.4开始,也许更早,你必须创建一个特定的渲染器,然后使用markdown作为参数调用render,即
def markdown
Redcarpet::Render::XHTML.new.render(yield)
end
最新文档可在此处找到:https://github.com/vmg/redcarpet
答案 1 :(得分:1)
我有同样的问题。上面没用。这是一个更简单的解决方案,没有自定义代码。
https://github.com/middleman/middleman/issues/1221#issuecomment-38104894
答案 2 :(得分:1)
这就是我所做的:
helpers do
def markdown(&block)
raise ArgumentError, "Missing block" unless block_given?
content = capture_html(&block)
concat Tilt['markdown'].new { content }.render
end
end
它使用默认的Middleman降价渲染。
答案 3 :(得分:1)
帮助将markdown
字符串转换为中间人的html
helpers do
def markdown(content)
Tilt['markdown'].new(context: @app) { content }.render
end
end
设置context: @app
参数以处理图像,与中间人帮助者链接并避免例外。
答案 4 :(得分:0)
我尝试了几种我在这里找到的方法,没有成功。最后,这是对我有用的解决方案:
def markdown(text)
require 'redcarpet'
require 'redcarpet/render_strip'
markdown = Redcarpet::Markdown.new(Redcarpet::Render::StripDown)
Markdown.new(text).to_html
end