纯ERB / Erubis中的块

时间:2012-03-22 03:37:06

标签: ruby erb

我有以下Ruby脚本:

require 'erubis'

def listing(title, attributes={})
  "output" + yield + "more output"
end

example = %Q{<% listing "db/migrate/[date]_create_purchases.rb", :id => "ch01_292" do %>
<![CDATA[class CreatePurchases < ActiveRecord::Migration
  def change
    create_table :purchases do |t|
      t.string :name
      t.float :cost
      t.timestamps
    end
  end
end]]>
<% end %>}

chapter = Erubis::Eruby.new(example)
p chapter.result(binding)

我试图在这里使用一个块并让它输出“输出”,然后输出块中的内容然后“更多输出”,但我似乎无法让它工作。

我知道ERB曾经在Rails 2.3中以这种方式工作,现在在Rails 3中使用<%= ...但我根本不使用Rails。这只是纯ERB。

如何让它输出所有内容?

2 个答案:

答案 0 :(得分:3)

Jeremy McAnally将我与this perfect description如何联系。

基本上,您需要告诉ERB将输出缓冲区存储在变量中。

脚本最终看起来像这样:

require 'erb'

def listing(title, attributes={})
  concat %Q{
<example id='#{attributes[:id]}'>
  <programlisting>
    <title>#{title}</title>}
  yield
  concat %Q{
  </programlisting>
</example>
  }
end

def concat(string)
  @output.concat(string)
end

example = %Q{<% listing "db/migrate/[date]_create_purchases.rb", :id => "ch01_292" do %>
<![CDATA[class CreatePurchases < ActiveRecord::Migration
  def change
    create_table :purchases do |t|
      t.string :name
      t.float :cost
      t.timestamps
    end
  end
end]]>
<% end %>}

chapter = ERB.new(example, nil, nil, "@output")
p chapter.result(binding)

答案 1 :(得分:0)

大。我记得很久以前就看过了。玩了一下我得到了这个:

require 'erubis'

def listing(title, attributes={})
    %Q{<%= "output #{yield} more output" %>}
end

example = listing "some title", :id => 50 do
            def say_something
              "success?"
            end
            say_something
          end


c = Erubis::Eruby.new(example)
p c.evaluate
# => "output success? more output"