ERB

class ERB

Parent:
Object

Attributes

encoding[R]

The encoding to eval

filename[RW]

The optional filename argument passed to Kernel#eval when the ERB code is run

lineno[RW]

The optional lineno argument passed to Kernel#eval when the ERB code is run

src[R]

The Ruby code generated by ERB

Public Class Methods

new(str, safe_level=nil, trim_mode=nil, eoutvar='_erbout') Show source

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 796
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 = *compiler.compile(str)
  @filename = nil
  @lineno = 0
end
version() Show source

Returns revision information for the erb.rb module.

# File lib/erb.rb, line 264
def self.version
  "erb.rb [2.1.0 #{ERB::Revision.split[1]}]"
end

Public Instance Methods

def_class(superklass=Object, methodname='result') Show source

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 920
def def_class(superklass=Object, methodname='result')
  cls = Class.new(superklass)
  def_method(cls, methodname, @filename || '(ERB)')
  cls
end
def_method(mod, methodname, fname='(ERB)') Show source

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 883
def def_method(mod, methodname, fname='(ERB)')
  src = self.src
  magic_comment = "#coding:#{@encoding}\n"
  mod.module_eval do
    eval(magic_comment + "def #{methodname}\n" + src + "\nend\n", binding, fname, -2)
  end
end
def_module(methodname='erb') Show source

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 901
def def_module(methodname='erb')
  mod = Module.new
  def_method(mod, methodname, @filename || '(ERB)')
  mod
end
location=((filename, lineno)) Show source
# File lib/erb.rb, line 826
def location=((filename, lineno))
  @filename = filename
  @lineno = lineno if lineno
end
make_compiler(trim_mode) Show source

Creates a new compiler for ERB- See ERB::Compiler-new for details

# File lib/erb.rb, line 808
def make_compiler(trim_mode)
  ERB::Compiler.new(trim_mode)
end
result(b=new_toplevel) Show source

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 856
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
run(b=new_toplevel) Show source

Generate results and print them. (see #result)

# File lib/erb.rb, line 844
def run(b=new_toplevel)
  print self.result(b)
end
set_eoutvar(compiler, eoutvar = '_erbout') Show source

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 836
def set_eoutvar(compiler, eoutvar = '_erbout')
  compiler.put_cmd = "#{eoutvar}.concat"
  compiler.insert_cmd = "#{eoutvar}.concat"
  compiler.pre_cmd = ["#{eoutvar} = ''"]
  compiler.post_cmd = ["#{eoutvar}.force_encoding(__ENCODING__)"]
end

Private Instance Methods

new_toplevel() Show source

Returns a new binding each time near TOPLEVEL_BINDING for runs that do not specify a binding.

# File lib/erb.rb, line 871
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.

在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号

意见反馈
返回顶部