我有以下 Ruby 脚本:
require 'nokogiri'
require 'erb'
listing = %Q{<% listing "app/controllers/purchases_controller.rb", :id => "ch01_724" do %>
foo
<% end %>}
erb = ERB.new(listing, nil, nil, "@output")
def listing(title, attributes={})
builder = Nokogiri::XML::Builder.new do |xml|
xml.example(attributes) do
xml.title "Listing 1.1 #{title}"
xml.programlisting do
yield
end
end
end
@output.concat(builder.doc.root.to_xml)
end
p erb.result(binding)
运行时输出如下内容:
"\n foo\n <example id=\"ch01_724\">\n <title>Listing 1.1 app/controllers/purchases_controller.rb</title>\n <programlisting/>\n</example>"
此字符串的“foo”部分应该在 programlisting
元素内,但由于某种原因,它被添加到字符串的开头。
这是为什么,我该如何解决?
最佳答案
那是因为通过 yield,您将控制权传递给 ERB,它获取“foo”,然后您连接该方法的输出。
Rails 是如何通过使用捕获来实现这一点的,它基本上是为新字符串切换输出缓冲区,然后连接该新字符串。
这样的事情似乎可行:
def listing(title, attributes={}, &block)
builder = Nokogiri::XML::Builder.new do |xml|
xml.example(attributes) do
xml.title "Listing 1.1 #{title}"
xml.programlisting capture(&block)
end
end
@output.concat(builder.doc.root.to_xml)
end
def capture
@_out, @output = @output, ""
yield
ensure
@output = @_out
end
关于ruby - Nokogiri + ERB 标签未排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9855072/