2012-03-22 53 views
5

我有以下Ruby腳本:塊純ERB/Erubis

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。

我怎樣才能得到它輸出的所有內容?

回答

3

傑里米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) 
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"