There are several implementations of eRuby, namely: • ERB • erubis • ember
erb erb is an implementation of eRuby written purely in the Ruby programming language and included in the Ruby standard library. A template can be generated by running a piece of code written using the ERB object. A simple example is as shown below: require 'erb' x = 400 simple_template = "Value of x is: is ." renderer = ERB.new(simple_template) puts output = renderer.result(binding) The result looks as follows: Value of x is: 400 The same could be achieved using the below code, which does not make use of an ERB object: x = 400 string = "The value of x is: #{x}" puts string Both of the above
code snippets generate the same output. But what happens when we interchange lines 2 with line 3 in the first
code snippet and line 1 with line 2 in the second code snippet? The first snippet changes to the code shown below: require 'erb' simple_template = "Value of x is: is ." x = 400 renderer = ERB.new(simple_template) puts output = renderer.result(binding) This still generates the same output. i.e., Value of x is: 400. The second code snippet changes to the following code: string = "The value of x is: #{x}" x = 400 puts string The above code will not get executed. This is because the 1st line does not know the value of x when it gets executed. Thus, the main reason for using an ERB object is to write templates ahead of time, by
binding variables and methods that may not exist at the given time. The template gets processed only when
result is called on the ERB object. In order to get access to
instance methods and
instance variable of an object, ERB makes use of a
binding object. Access to variables and methods of an object is given by the private
binding object which exists in each Ruby class. It is easy to get access to methods and variables within the method of a
class. But to access variables of a different class, that class will have to expose its binding object via a public method. The example is as shown below: class ERBExample attr_accessor:variable1 # using bind to access class variables def render() renderer.result(binding) end def initialize(variable1) @variable1 = variable1 end # Expose private binding() method. def get_binding binding() end end example = ERBExample.new(variable1) renderer = ERB.new(template) puts output = renderer.result(example.get_binding) As we can see in the above example, we are exposing the
binding object of the class ERBExample. Furthermore, we have used the
binding object to access the variables and methods of the class within one of its methods.
new() method of ERB The
new method of the ERB object takes two more
parameters. The second parameter specifies a safety level. By giving a number in the second parameter (max value = 4) one can make the template run in a different
thread. The value of the number determines the safety level. At the maximum isolation level, unless the binding object is marked as trusted, ERB cannot use it. The third parameter specify optional modifiers. These can be used to control adding of newlines to the output. For example, to make sure that ERB does not output newlines after tag ends, we can create the ERB object as shown below: renderer = ERB.new(template, 3, '>') To only provide the third parameter and ignore the second parameter, use 0 as the input for second parameter. ERB has many other methods exposed which can be used to render a template. For full list of APIs exposed by the ERB object, refer to the ERB documentation given in the reference section.
Running ERB from Command-line As it has been already explained in the previous sections, the erb is used to generate templates. This is often used to generate web pages or other text files. Usually needs erb to push the output to his or her desired file. To achieve this, we can use the redirection ability provided in the
command-line and redirect the output to a file rather than making it print on the standard output. erb sample1.erb.txt > my_view.html.erb In the above example, output gets redirected to
my_view.html.erb file. Linking of third party libraries is achievable by making use of the -r option and providing the name of the library. To remember this functionality, one can remember the Ruby key word
require, which does the same functionality as the -r option. The below example uses the IPAddr library. erb -r IPAddr sample1.txt.erb > my_view.html.erb As we have mentioned about the
safety levels in the previous section, one can specify the safety level as a command line argument using the -S option: erb -S 4 sample1.erb.txt > my_view.html.erb
erubis erubis is an implementation of eRuby implemented in Ruby and also in
Java. According to its home page, it runs faster than eRuby and ERb and has several useful options, including alternate tags allowing for valid
XML.
ember ember is a pure Ruby implementation of eRuby for
Linux. It allows debugging of eRuby templates, improves their composability, and provides powerful shorthand eRuby directives. == Different implementation tags comparison ==