ERB
class ERB
Parent:Object
属性
encodingR
编码为eval
filenameRW
在ERB代码运行时传递给Kernel#eval 的可选文件名
参数
linenoRW
ERB代码运行时,将可选的lineno
参数传递给Kernel#eval
srcR
由ERB生成的Ruby代码
公共类方法
new(str, safe_level=nil, trim_mode=nil, eoutvar='_erbout') Show source
使用str中
指定的模板构造一个新的ERB对象。
ERB对象的工作原理是构建一段Ruby代码,在运行时输出完成的模板。如果safe_level
设置为非零值,则ERB代码将在$ SAFE
设置为所提供的级别的单独线程中运行。
如果trim_mode
传递了一个包含以下一个或多个修饰符的字符串,则ERB将按照列出的方式调整其代码生成:
% 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 -%>
eoutva
可以用来设置变量的名称,而ERB将在其中生成输出。当需要通过相同的绑定运行多个ERB模板和/或想要控制输出结束的位置时,这会非常有用。传递要在String中使用的变量的名称。
例子
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
生成的结果:
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
version() Show source
返回erb.rb模块的修订信息。
# File lib/erb.rb, line 263
def self.version
"erb.rb [2.1.0 #{ERB::Revision.split[1]}]"
end
公共实例方法
def_class(superklass=Object, methodname='result') Show source
定义具有methodname
作为实例方法的未命名类,并将其返回。
例子:
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
def_method(mod, methodname, fname='(ERB)') Show source
从编译的Ruby源代码定义methodname
作为mod的
实例方法。
例子:
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
def_module(methodname='erb') Show source
创建未命名的模块,将methodname
定义为它的实例方法,并返回它。
例子:
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
location=((filename, lineno)) Show source
# File lib/erb.rb, line 857
def location=((filename, lineno))
@filename = filename
@lineno = lineno if lineno
end
make_compiler(trim_mode) Show source
为ERB创建一个新的编译器。有关详细信息,请参阅ERB :: Compiler.new
# File lib/erb.rb, line 839
def make_compiler(trim_mode)
ERB::Compiler.new(trim_mode)
end
result(b=new_toplevel) Show source
执行生成的ERB代码以生成完整的模板,并返回该代码的结果。(有关如何通过safe_level
影响此过程的详细信息,请参阅:new 。)
b
接受一个Binding对象,该对象用于设置代码评估的上下文。
# 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
run(b=new_toplevel) Show source
生成结果并打印出来。(请参阅#result)
# File lib/erb.rb, line 875
def run(b=new_toplevel)
print self.result(b)
end
set_eoutvar(compiler, eoutvar = '_erbout') Show source
这可以用于设置:: new中描述的eoutvar
。尽管使用构造函数可能更容易,因为调用此方法需要设置ERB 编译器
对象。
# 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
私有实例方法
new_toplevel() Show source
对于未指定绑定的运行,每次在
TOPLEVEL_BINDING 附近
返回一个新绑定。
# File lib/erb.rb, line 902
def new_toplevel
TOPLEVEL_BINDING.dup
end