2012-03-22 12 views
5

Mam następujący Ruby skrypt:Bloki w czystej 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) 

Ja próbuje użyć blok tutaj i zmusić go do wyjścia „wyjście”, a następnie zawartość w bloku, a następnie „więcej wyjście ", ale nie mogę sprawić, żeby działało.

Wiem, że ERB działał w ten sposób w Railsach 2.3 i teraz pracuje z <%= w Railsach 3 ... ale w ogóle nie używam Railsów. To tylko czysty ERB.

Jak mogę uzyskać wydruk całej zawartości?

Odpowiedz

3

Jeremy McAnally połączył mnie z this perfect description, jak to zrobić.

Zasadniczo, musisz poinformować ERB, aby zapisał bufor wyjściowy w zmiennej.

Skrypt kończy się wyglądać jak ten:

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

Wielki. Pamiętam, że widziałem to jakiś czas temu. Grając trochę, otrzymywałem:

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"