ERB
class ERB
Attributes
The encoding to eval
The optional filename argument passed to Kernel#eval when the ERB code is run
The optional lineno argument passed to Kernel#eval when the ERB code is run
The Ruby code generated by ERB
Public Class Methods
Constructs a new ERB object with the template specified in str-
An ERB object works by building a chunk of Ruby code that will output the completed template when run. If safe_level is set to a non-nil value, ERB code will be run in a separate thread with $SAFE set to the provided level-
If trim_mode is passed a String containing one or more of the following modifiers, ERB will adjust its code generation as listed:
% enables Ruby code processing for lines beginning with % <> omit newline for lines starting with <% and ending in %> > omit newline for lines ending in %> - omit blank lines ending in -%>
eoutvar can be used to set the name of the variable ERB will build up its output in- This is useful when you need to run multiple ERB templates through the same binding and/or when you want to control where output ends up. Pass the name of the variable to be used inside a String.
Example
require "erb" # build data class class Listings PRODUCT = { :name => "Chicken Fried Steak", :desc => "A well messages pattie, breaded and fried.", :cost => 9.95 } attr_reader :product, :price def initialize( product = "", price = "" ) @product = product @price = price end def build b = binding # create and run templates, filling member data variables ERB.new(" <%= PRODUCT[:name] %> <%= PRODUCT[:desc] %> ".gsub(/^\s+/, ""), 0, "", "@product").result b ERB.new(" <%= PRODUCT[:name] %> -- <%= PRODUCT[:cost] %> <%= PRODUCT[:desc] %> ".gsub(/^\s+/, ""), 0, "", "@price").result b end end # setup template data listings = Listings.new listings.build puts listings.product + "\n" + listings.price
Generates
Chicken Fried Steak A well messages pattie, breaded and fried. Chicken Fried Steak -- 9.95 A well messages pattie, breaded and fried.
# File lib/erb.rb, line 827 def initialize(str, safe_level=nil, trim_mode=nil, eoutvar='_erbout') @safe_level = safe_level compiler = make_compiler(trim_mode) set_eoutvar(compiler, eoutvar) @src, @encoding, @frozen_string = *compiler.compile(str) @filename = nil @lineno = 0 end
Returns revision information for the erb.rb module.
# File lib/erb.rb, line 263 def self.version "erb.rb [2.1.0 #{ERB::Revision.split[1]}]" end
Public Instance Methods
Define unnamed class which has methodname as instance method, and return it.
example:
class MyClass_ def initialize(arg1, arg2) @arg1 = arg1; @arg2 = arg2 end end filename = 'example.rhtml' # @arg1 and @arg2 are used in example.rhtml erb = ERB.new(File.read(filename)) erb.filename = filename MyClass = erb.def_class(MyClass_, 'render()') print MyClass.new('foo', 123).render()
# File lib/erb.rb, line 950 def def_class(superklass=Object, methodname='result') cls = Class.new(superklass) def_method(cls, methodname, @filename || '(ERB)') cls end
Define methodname as instance method of mod from compiled Ruby source.
example:
filename = 'example.rhtml' # 'arg1' and 'arg2' are used in example.rhtml erb = ERB.new(File.read(filename)) erb.def_method(MyClass, 'render(arg1, arg2)', filename) print MyClass.new.render('foo', 123)
# File lib/erb.rb, line 914 def def_method(mod, methodname, fname='(ERB)') src = self.src.sub(/^(?!#|$)/) {"def #{methodname}\n"} << "\nend\n" mod.module_eval do eval(src, binding, fname, -1) end end
Create unnamed module, define methodname as instance method of it, and return it.
example:
filename = 'example.rhtml' # 'arg1' and 'arg2' are used in example.rhtml erb = ERB.new(File.read(filename)) erb.filename = filename MyModule = erb.def_module('render(arg1, arg2)') class MyClass include MyModule end
# File lib/erb.rb, line 931 def def_module(methodname='erb') mod = Module.new def_method(mod, methodname, @filename || '(ERB)') mod end
# File lib/erb.rb, line 857 def location=((filename, lineno)) @filename = filename @lineno = lineno if lineno end
Creates a new compiler for ERB- See ERB::Compiler-new for details
# File lib/erb.rb, line 839 def make_compiler(trim_mode) ERB::Compiler.new(trim_mode) end
Executes the generated ERB code to produce a completed template, returning the results of that code- (See ::new for details on how this process can be affected by safe_level.)
b accepts a Binding object which is used to set the context of code evaluation-
# File lib/erb.rb, line 887 def result(b=new_toplevel) if @safe_level proc { $SAFE = @safe_level eval(@src, b, (@filename || '(erb)'), @lineno) }.call else eval(@src, b, (@filename || '(erb)'), @lineno) end end
Generate results and print them. (see #result)
# File lib/erb.rb, line 875 def run(b=new_toplevel) print self.result(b) end
Can be used to set eoutvar as described in ::new. It's probably easier to just use the constructor though, since calling this method requires the setup of an ERB compiler object-
# File lib/erb.rb, line 867 def set_eoutvar(compiler, eoutvar = '_erbout') compiler.put_cmd = "#{eoutvar}.concat" compiler.insert_cmd = "#{eoutvar}.concat" compiler.pre_cmd = ["#{eoutvar} = String.new"] compiler.post_cmd = ["#{eoutvar}.force_encoding(__ENCODING__)"] end
Private Instance Methods
Returns a new binding each time near TOPLEVEL_BINDING for runs that do not specify a binding.
# File lib/erb.rb, line 902 def new_toplevel TOPLEVEL_BINDING.dup end
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.