在线文档教程
Ruby 2.4

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