ruby - Nokogiri + ERB 标签未排序

标签 ruby nokogiri

我有以下 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/

相关文章:

ruby - 使用 Nokogiri::XML::Builder 忽略空节点的最干净的方法是什么

ruby-on-rails - 如何在Rails中使用Nokogiri从URL获得HTML正文?

ruby - 在 Nokogiri 元素中编辑文本或使用正则表达式

html - 获取最近父标签的内部文本

ruby - 从 ruby​​ 中的单段中的标准输入或文件读取

xpath:如何在<br>标记之前和之后选择特定的文本节点?

ruby-on-rails - 使用 accepts_nested_attributes_for 为 FactoryGirl 对象生成嵌套属性

ruby-on-rails - 带有 erb 的 YAML 未解析

ruby - 如何在引发错误之前使用检查内容

ruby - 为什么 MiniTest::Spec 没有 wont_raise 断言?