|
2 | 2 |
|
3 | 3 | An easy to use but powerful templating system for Ruby. |
4 | 4 |
|
5 | | -## Installation |
| 5 | +## Introduction |
6 | 6 |
|
7 | | -Add this line to your application's Gemfile: |
| 7 | +ERB provides an easy to use but powerful templating system for Ruby. Using |
| 8 | +ERB, actual Ruby code can be added to any plain text document for the |
| 9 | +purposes of generating document information details and/or flow control. |
8 | 10 |
|
9 | | -```ruby |
10 | | -gem 'erb' |
| 11 | +A very simple example is this: |
| 12 | + |
| 13 | +```rb |
| 14 | +require 'erb' |
| 15 | + |
| 16 | +x = 42 |
| 17 | +template = ERB.new <<-EOF |
| 18 | + The value of x is: <%= x %> |
| 19 | +EOF |
| 20 | +puts template.result(binding) |
| 21 | +``` |
| 22 | + |
| 23 | +Prints: `The value of x is: 42` |
| 24 | + |
| 25 | +More complex examples are given below. |
| 26 | + |
| 27 | +## Recognized Tags |
| 28 | + |
| 29 | +ERB recognizes certain tags in the provided template and converts them based |
| 30 | +on the rules below: |
| 31 | + |
| 32 | +```erb |
| 33 | +<% Ruby code -- inline with output %> |
| 34 | +<%= Ruby expression -- replace with result %> |
| 35 | +<%# comment -- ignored -- useful in testing %> |
| 36 | +% a line of Ruby code -- treated as <% line %> (optional -- see ERB.new) |
| 37 | +%% replaced with % if first thing on a line and % processing is used |
| 38 | +<%% or %%> -- replace with <% or %> respectively |
11 | 39 | ``` |
12 | 40 |
|
13 | | -And then execute: |
| 41 | +All other text is passed through ERB filtering unchanged. |
| 42 | + |
| 43 | +## Options |
| 44 | + |
| 45 | +There are several settings you can change when you use ERB: |
| 46 | +* the nature of the tags that are recognized; |
| 47 | +* the binding used to resolve local variables in the template. |
| 48 | + |
| 49 | +See the ERB.new and ERB#result methods for more detail. |
| 50 | + |
| 51 | +## Character encodings |
| 52 | + |
| 53 | +ERB (or Ruby code generated by ERB) returns a string in the same |
| 54 | +character encoding as the input string. When the input string has |
| 55 | +a magic comment, however, it returns a string in the encoding specified |
| 56 | +by the magic comment. |
| 57 | + |
| 58 | +```rb |
| 59 | +# -*- coding: utf-8 -*- |
| 60 | +require 'erb' |
| 61 | + |
| 62 | +template = ERB.new <<EOF |
| 63 | +<%#-*- coding: Big5 -*-%> |
| 64 | + __ENCODING__ is <%= __ENCODING__ %>. |
| 65 | +EOF |
| 66 | +puts template.result |
| 67 | +``` |
14 | 68 |
|
15 | | - $ bundle install |
| 69 | +Prints: `__ENCODING__ is Big5.` |
16 | 70 |
|
17 | | -Or install it yourself as: |
| 71 | +## Examples |
18 | 72 |
|
19 | | - $ gem install erb |
| 73 | +### Plain Text |
20 | 74 |
|
21 | | -## Development |
| 75 | +ERB is useful for any generic templating situation. Note that in this example, we use the |
| 76 | +convenient "% at start of line" tag, and we quote the template literally with |
| 77 | +`%q{...}` to avoid trouble with the backslash. |
| 78 | + |
| 79 | +```rb |
| 80 | +require "erb" |
| 81 | +
|
| 82 | +# Create template. |
| 83 | +template = %q{ |
| 84 | + From: James Edward Gray II <james@grayproductions.net> |
| 85 | + To: <%= to %> |
| 86 | + Subject: Addressing Needs |
| 87 | +
|
| 88 | + <%= to[/\w+/] %>: |
| 89 | +
|
| 90 | + Just wanted to send a quick note assuring that your needs are being |
| 91 | + addressed. |
| 92 | +
|
| 93 | + I want you to know that my team will keep working on the issues, |
| 94 | + especially: |
| 95 | +
|
| 96 | + <%# ignore numerous minor requests -- focus on priorities %> |
| 97 | + % priorities.each do |priority| |
| 98 | + * <%= priority %> |
| 99 | + % end |
| 100 | +
|
| 101 | + Thanks for your patience. |
| 102 | +
|
| 103 | + James Edward Gray II |
| 104 | +}.gsub(/^ /, '') |
| 105 | +
|
| 106 | +message = ERB.new(template, trim_mode: "%<>") |
| 107 | +
|
| 108 | +# Set up template data. |
| 109 | +to = "Community Spokesman <spokesman@ruby_community.org>" |
| 110 | +priorities = [ "Run Ruby Quiz", |
| 111 | + "Document Modules", |
| 112 | + "Answer Questions on Ruby Talk" ] |
| 113 | +
|
| 114 | +# Produce result. |
| 115 | +email = message.result |
| 116 | +puts email |
| 117 | +``` |
| 118 | + |
| 119 | +Generates: |
| 120 | + |
| 121 | +``` |
| 122 | +From: James Edward Gray II <james@grayproductions.net> |
| 123 | +To: Community Spokesman <spokesman@ruby_community.org> |
| 124 | +Subject: Addressing Needs |
22 | 125 |
|
23 | | -After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. |
| 126 | +Community: |
| 127 | + |
| 128 | +Just wanted to send a quick note assuring that your needs are being addressed. |
| 129 | + |
| 130 | +I want you to know that my team will keep working on the issues, especially: |
| 131 | + |
| 132 | + * Run Ruby Quiz |
| 133 | + * Document Modules |
| 134 | + * Answer Questions on Ruby Talk |
| 135 | + |
| 136 | +Thanks for your patience. |
| 137 | + |
| 138 | +James Edward Gray II |
| 139 | +``` |
| 140 | +
|
| 141 | +### Ruby in HTML |
| 142 | +
|
| 143 | +ERB is often used in .rhtml files (HTML with embedded Ruby). Notice the need in |
| 144 | +this example to provide a special binding when the template is run, so that the instance |
| 145 | +variables in the Product object can be resolved. |
| 146 | +
|
| 147 | +```rb |
| 148 | +require "erb" |
| 149 | +
|
| 150 | +# Build template data class. |
| 151 | +class Product |
| 152 | + def initialize( code, name, desc, cost ) |
| 153 | + @code = code |
| 154 | + @name = name |
| 155 | + @desc = desc |
| 156 | + @cost = cost |
| 157 | +
|
| 158 | + @features = [ ] |
| 159 | + end |
| 160 | +
|
| 161 | + def add_feature( feature ) |
| 162 | + @features << feature |
| 163 | + end |
| 164 | +
|
| 165 | + # Support templating of member data. |
| 166 | + def get_binding |
| 167 | + binding |
| 168 | + end |
| 169 | +
|
| 170 | + # ... |
| 171 | +end |
| 172 | +
|
| 173 | +# Create template. |
| 174 | +template = %{ |
| 175 | + <html> |
| 176 | + <head><title>Ruby Toys -- <%= @name %></title></head> |
| 177 | + <body> |
| 178 | +
|
| 179 | + <h1><%= @name %> (<%= @code %>)</h1> |
| 180 | + <p><%= @desc %></p> |
| 181 | +
|
| 182 | + <ul> |
| 183 | + <% @features.each do |f| %> |
| 184 | + <li><b><%= f %></b></li> |
| 185 | + <% end %> |
| 186 | + </ul> |
| 187 | +
|
| 188 | + <p> |
| 189 | + <% if @cost < 10 %> |
| 190 | + <b>Only <%= @cost %>!!!</b> |
| 191 | + <% else %> |
| 192 | + Call for a price, today! |
| 193 | + <% end %> |
| 194 | + </p> |
| 195 | +
|
| 196 | + </body> |
| 197 | + </html> |
| 198 | +}.gsub(/^ /, '') |
| 199 | +
|
| 200 | +rhtml = ERB.new(template) |
| 201 | +
|
| 202 | +# Set up template data. |
| 203 | +toy = Product.new( "TZ-1002", |
| 204 | + "Rubysapien", |
| 205 | + "Geek's Best Friend! Responds to Ruby commands...", |
| 206 | + 999.95 ) |
| 207 | +toy.add_feature("Listens for verbal commands in the Ruby language!") |
| 208 | +toy.add_feature("Ignores Perl, Java, and all C variants.") |
| 209 | +toy.add_feature("Karate-Chop Action!!!") |
| 210 | +toy.add_feature("Matz signature on left leg.") |
| 211 | +toy.add_feature("Gem studded eyes... Rubies, of course!") |
| 212 | +
|
| 213 | +# Produce result. |
| 214 | +rhtml.run(toy.get_binding) |
| 215 | +``` |
| 216 | + |
| 217 | +Generates (some blank lines removed): |
| 218 | + |
| 219 | +```html |
| 220 | +<html> |
| 221 | + <head><title>Ruby Toys -- Rubysapien</title></head> |
| 222 | + <body> |
| 223 | + |
| 224 | + <h1>Rubysapien (TZ-1002)</h1> |
| 225 | + <p>Geek's Best Friend! Responds to Ruby commands...</p> |
| 226 | + |
| 227 | + <ul> |
| 228 | + <li><b>Listens for verbal commands in the Ruby language!</b></li> |
| 229 | + <li><b>Ignores Perl, Java, and all C variants.</b></li> |
| 230 | + <li><b>Karate-Chop Action!!!</b></li> |
| 231 | + <li><b>Matz signature on left leg.</b></li> |
| 232 | + <li><b>Gem studded eyes... Rubies, of course!</b></li> |
| 233 | + </ul> |
| 234 | + |
| 235 | + <p> |
| 236 | + Call for a price, today! |
| 237 | + </p> |
| 238 | + |
| 239 | + </body> |
| 240 | +</html> |
| 241 | +``` |
24 | 242 |
|
25 | | -To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). |
| 243 | +## Notes |
26 | 244 |
|
27 | | -## Contributing |
| 245 | +There are a variety of templating solutions available in various Ruby projects. |
| 246 | +For example, RDoc, distributed with Ruby, uses its own template engine, which |
| 247 | +can be reused elsewhere. |
28 | 248 |
|
29 | | -Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/erb. |
| 249 | +Other popular engines could be found in the corresponding |
| 250 | +[Category](https://www.ruby-toolbox.com/categories/template_engines) of |
| 251 | +The Ruby Toolbox. |
30 | 252 |
|
31 | 253 | ## License |
32 | 254 |
|
|
0 commit comments